返回首页

微商母婴用品货源从哪找?

来源:www.shimaoedu.com   时间:2023-08-08 10:46   点击:81  编辑:admin   手机版

一、微商母婴用品货源从哪找?

本人接触这个母婴代理也很长一段时间了,其实现在微商母婴代理挺多的,货源不能说是什么厂家,这种不现实,厂家也不会接这种小单子,至于一个人为什么能代理这么多牌子,这个问题得追究到货源团队,有专门和各大品牌供货商谈合作的货源团队,谈成的拿货价团队成员可以享受,然后货源团队的利益来源于供货商的广告费,相当于互利互惠,这就是所谓资源合集的形成。

大家都是冲着一手货源入代理,其实一手货源真的去找的话挺难的,市面上各种价格都有,新手小白很难分辨的,所以在选择加入的时候,要选择团队实力,售后处理能力,等等诸如此类的问题,不要什么都没了解, 就直接盲目加入啦!

下面就跟大家分析一下这个母婴代理适合人群以及本人代理团队的优缺点,大家思量清楚自己是否适合再入代理,虽然是几百块的事情,但是有了孩子几百块也得省着花啦,白白打水漂了就不值得了!

一、母婴代理适合人群

1.当之无愧的肯定是宝妈们,特别是宝宝刚出生的

大家都知道养一个孩子的开销有多大,准妈妈们在孩子还未出生前就得准备一大堆东西

尿不湿,奶粉,奶瓶,衣服,玩具,毛巾,湿巾,纸巾,宝宝霜,身体霜,洗澡套装,小床,小推车。大一点还有餐椅,辅食工具,餐盘,安全座椅,绘本,各种玩具,想想真的是一笔又一笔的血汗钱就这样哗哗哗的用啊。

此时你入了代理,节省的钱可以赚回来十个代理费用。当然你也可以分享给其他的亲朋好友,自用+分享赚钱也是很不错的,说不定还能作为自己的第二职业或者第一职业。

2.想通过兼职或者第一职业赚钱

如果你是有工作的,那么你可以通过代理进行兼职,额外赚取补贴家用,俗话说我赚100能交水费,赚200可以买件衣服,额外赚来的钱花着也是一种幸福。

如果你没有工作,又想通过自己的努力赚取,那么母婴代理也是一份不错的选择,毕竟母婴市场流量是很大的。

二、母婴代理的优点

1. 品种类广泛且齐全

刚刚说到的尿不湿,奶粉,奶瓶,衣服,玩具,毛巾,湿巾,纸巾,宝宝霜,身体霜,洗澡套装,小床,小推车,餐椅,辅食工具,餐盘,安全座椅,绘本,各种玩具,代理都涵盖了。

2. 母婴牌子的东西都是正品,不会说买到假货啊,这个是大可不必担心的。

3.货源会不定期增加,最重要的是,不用囤货,一件代发,售后保障到位

三、母婴代理存在一些缺点:

母婴产品品牌过多,类别过多!

每个想加入母婴代理的人一开始都想着货一定要多一定要全,这样我才能大卖特卖。以我的经验来看,东西确实是越多越好,看起来丰富多彩,但是大家却忽略了一个重要的东西,那就是时间成本!

大家都是有孩子的人,或者在孕期中,时间精力往往是不够用的。我举个简单的例子,一个牌子的奶瓶,有宽口的,小口的,有200ml的,还有300ml的,还有各种形状的,这个算是简单的,一个产品都这么复杂,那么多的产品算算自己所得跟自己的时间成本哪个更多!

四、如何卖产品

现在的代理拿到代理权就开始在朋友圈拼命的刷屏,恨不得让全世界都知道我这里有很多又好又便宜的东西,殊不知现在大家对这些广告都是厌恶到底的,一看到你刷屏直接屏蔽你了,你发的东西再好,他也是没机会看到的,更别说来购买你的东西。

所以卖货也要有卖货的思维。很多人都打着低价正品的旗号去卖东西,往往卖到筋疲力尽,却忘了朋友圈卖货的本质是出卖你自己,只有自己本人的IP被认可,你的货品才会被认可。这个如果有感兴趣的也可以相互交流。

好了,时间因素暂时写这么多吧,大家如果觉得我的文章对您有所帮助,麻烦点个赞哦!

二、母婴用品哪个品牌好?

母婴用品太多了吧

emm,推荐平时用的比较多的吧,一款好用到爆的纸尿裤~

给孩子打疫苗的时候领的试用装,这个颜值真的是非常高了,很用心啦( '▿ ' )

拿了好几片,纸尿裤拉拉裤都有

里面白白净净,没有异味,手感特别特别好,不要太软

穿上之后也挺好看有木有ヾ(❀╹◡╹)ノ~

纸尿裤挺薄的,试了一下吸收性挺好的,换下来的纸尿裤吸了好多,表面也挺干爽,宝宝也不红屁屁

在网上看了价格也不贵,就一直用到现在~我觉得是非常非常好用了*罒▽罒*

三、母婴用品的微商品牌靠得住么?

这个需要因情况而论,有的微商是正品,质量有保证,但有的可能是小作坊出来的,质量难以保证,微商平台还是鱼龙混杂,什么情况都有可能发生。为了母婴的健康,还是建议去正规品牌店购买,无论是质量还是售后都是有保障的。

四、想要做母婴用品的代理商?哪个品牌好?怎么经营?

自用和卖货都不建议入单一品牌的,代理费太贵了,还得屯货,现在有那种交了代理费可以拿到n个货源的那种。

五、母婴用品十大品牌都有那些?

1、爱婴坊

爱婴坊母婴用品有限公司,成立于2001年,致力于母婴用品的服务业务,至今已有六年历程。爱婴坊公司依靠先进的经营理念、明确市场发展方向,不断的改革创新,完善的产品结构和成熟的营销经验,积极开拓全国婴幼儿用品市场,制作了安全、健康、高质量的母婴用品,是每个家长信赖的品牌。

2、新安怡

来自英国的著名品牌,1984是出世于英国,经过20年的不断创新,已成为母婴用品世界第一品牌。现已成为世界最著名的母婴护理品牌,在欧洲和美国是非常受人喜爱的。

3、贝亲

作为婴幼儿用品十大品牌之一的贝亲,产品从孕期到育婴都有,包括孕妇护肤品、婴儿哺喂用品、婴儿护理用品、婴儿出行用品等等,比如在奶瓶、奶嘴、卫生用品、护肤用品的选择上,大部分的妈妈都会用贝亲。

4、好孩子

好孩子集团------以育儿科学研究为基础,儿童产品研发为核心,本着“关心孩子,服务家庭”的理念,为全球市场提供日益丰富的儿童产品,拥有中国最早的育儿服务和儿童产品购物网站,中国业界最多的产品专利,拥有一个覆盖全中国的产品分销、零售和服务网络,占地1200余亩的专业制造基地,以及中国儿童用品行业唯一的中国驰名商标——“好孩子”。

5、婴知岛

苏州婴知岛加盟、是一家专业的孕婴商品连锁零售企业,经过多年的发展,现已有直营门店和加盟店共40多家,已发展成为苏州最具规模的孕婴用品零售连锁机构及国内知名的孕婴用品零售连锁机构。2008年婴知岛加盟将发展以直营和合作加盟并重的陆地店铺为主,以B2C网站为窗口,以目录直销为辅的三位一体的营销模式。

6、帮宝适

作为宝洁公司著名的婴儿卫生系列产品,帮宝适已经成为各国父母首先的婴儿护理用品之一。帮宝适纸尿裤包括特级棉柔纸尿裤、新超薄干爽纸尿裤、干爽健康纸尿裤、拉拉裤、护儿婴儿湿巾等,而最新推出的全新升级特级棉柔纸尿裤无疑是最受欢迎的。

7、妈咪宝贝

通过婴儿护理、女性护理、成人护理、清洁护理的4大支柱事业,通过开发更高品质的商品和积极的市场活动,彻底地实现消费者满足。妈咪宝贝将妈妈的爱化为有形,随时随地贴心呵护宝宝成长。

8、小天使

北京快乐小天使婴儿产品有限公司是一家婴儿产品的企业,是经国家相关部门批准注册的企业。主营推车、电动车、自行车、童床等,北京快乐小天使婴儿产品有限公司本着“客户第一,诚信至上”的原则让消费者很是满意。

9、NUK奶瓶

NUK奶瓶来自德国,NUK奶瓶采用优质材料,特别是NUK玻璃奶瓶采用耐高温玻璃制成,NUK奶瓶是全球妈妈的值得信赖的选择。NUK奶瓶包括NUK塑料奶瓶、NUK玻璃奶瓶、标准口径德国NUK奶瓶、宽口径德国NUK奶瓶。

10、豆豆暖房

上海豆豆暖房妇幼用品有限公司是一家专业从事母婴护理相关产品的综合性公司,公司产品包涵了母婴家庭所需的衣、食、住、行、娱乐方面的用品。豆豆暖房把“专业、方便、省钱、永续经营”的经营理念带回全国各地,公司强大的采购中心、营运中心,及时做好各家门店的配送服务,及门店开业指导培训市场调研等服务。

六、国外母婴用品品牌有哪些?

看你需要哪一类产品。 简单列举一些:

美德乐(吸奶器,防溢乳垫,哺乳文胸)

兰思诺(乳头霜,防溢乳垫,储奶袋,吸奶器),

飞利浦新安怡(吸奶器,奶瓶,安抚奶嘴),

mama&kids(孕妇和婴儿用的护肤品),

贝亲(大名鼎鼎日用洗护奶瓶要啥有啥),花王(尿不湿,产褥垫),

尤妮佳(尿不湿),

葛莱(婴儿床,推车,安全座椅)

宝得适、迈可适、(安全座椅)

艾惟诺、加州宝宝、地球妈妈/earthmama等:母婴护肤,洗护品

nuk:奶瓶等

布朗博士:奶瓶等

skip hop、LAMAZE、b.toys、费雪、tinylove:玩具

Attitude、保宁、甘尼克宝贝:婴儿清洁剂类(奶瓶清洗剂,洗衣液等)

eargobaby,babybjorn:婴儿背带

jolly baby:布书

不给个范围还能列举好多好多好多…就先写到这儿吧…

七、十大母婴用品品牌排行哪个好?

1:贝因美

2:爱婴坊

3:好孩子

4:丽婴房

5:天邦童心玩具

6:豆豆暖房

8:迪士尼卡通

9:婴姿坊

10:天才宝贝

八、我现在在做微商卖些母婴用品,但是没有客源怎么办呀?

以前我也曾经做过母婴用品销售 ,我通过我的经历,和大家讲讲,应该如何去做好相关的销售工作。

销售渠道分为线上和线下渠道 ,线下渠道我这里不详细的介绍,主要讲讲线上渠道我是怎么运作的 。


互联网上面很多说,一天引流 1000 ,5000 的这些方法,一大堆 ,这些千万别当真 。

真正做过引流就知道,精准的引流,如果能做到1000 那是什么概念,就是光卖流量就是 几千块钱了。

如果你做精准的行业粉丝 ,比如股市,基金,保险等等含金量非常高的企业,那么有1000 精准粉丝 ,你一天收入

没有1万块,我把泥当饭吃 。

我这里所指的是精准的粉丝,不是通过小电影来的那种泛粉。

这些所谓的方法都是不负责任的,为了博人眼球的,忽悠小白。

所以有时候,我们定的目标,别太大了,一天有精准 的粉丝 100个就已经够你聊了 ,这样的小目标更容易实现。


引流渠道的分类

引流渠道有很多,比如比较常见的 ,短视频 ,软文精准引流,电销渠道 等等 。

通过功能上面分又分为被动式引流(别人主动加你) 和主动式引流(你主动加别人)

从效果上面看 ,肯定是被动式效果更好 ,因为中国有一个说法。黄鼠狼给鸡拜年,不按好心 。

你主动加别人,别人戒备心比较强,转化是需要比较长的时间 。

短视频,很多人做 ,要做出高质量的短视频,需要花费的时间不见得就比软文来得简单 。

所以今天我重点的讲讲软文引流 ,引流精准的粉丝 。


软文引流-:

首先 ,我们要销售对应母婴类的产品,我们先要分析下 ,我们的客户主要是什么样的人 ,他们都喜欢关心那些话题 。

然后 对症下药 ,切实的帮助别人 ,这样你才容易赢得信任,才好推销你的产品 。

比如说母婴类的,通常这些人都是家庭主妇,他们比较关心的是那些问题?



这里抛砖引玉的 介绍下 ,一般与孩子相关的话题,是非常容易吸引到精准的宝妈粉丝 。


引流切记,要切实帮助别人,帮别人解决问题是最好的引流手段

很多人,引流,卖母婴用品,就一上来就开始推广自己的产品,这样平台不喜欢你 ,你的文章被定义成广告

那么被删除是非常容易的事 。

所以我们开始就得先定义好,帮助别人也就是帮助我们自己 。我们可以先准备好大量的 与母婴相关的一些

有价值,能切实帮助到别人的 相关知识,比如婴儿护理 ,如何提供孩子智力 ,如何帮助孩子长高。



我们可以花点小钱 ,去购买一些比较专业点的 一些与母婴相关的文章或是视频 。

然后有了相关的软文素材资料 ,就可以 进入实质的 软文引流 。


厚积薄发--引流需要的是坚持


做引流 ,不要想着,天天躺着,客户就来了,很多宣传所谓的一些引流工具,躺着粉丝就一会加满了 ,

如果钱那么好赚,各个都是亿万富翁了 ,

引流是一个苦逼活 ,需要日复一日的积累 。

这里用一个竹子定律解释最为合适了 。

科普下 :

竹子用了4年的时间,仅仅长了3cm,从第五年开始,它以 每天30cm的速度生长,仅仅用了6周的时间,就长到了15米。

当你的文章积累到了一定程度的时候 ,就会有爆发 。

很多人引流,做不下去的根本原因,太过心浮气躁 ,本身可能各方面问题 ,

比如经济问题 ,需要急切的变现 ,急切的改变现状,总希望一周就变现一波 ,然后买房买车,解决一切问题 。

做一种引流方法,做了1 ,2 周,没有效果 ,就直接放弃,又换另外一个方法 。

然后不停的重复 ,过了 几个月 ,客户没有找到,人生就比较迷茫 ,所以成功往往属于比较少的 人 。

大部分人坚持不到 2周就放弃 。


建立自己的引流矩阵:大号 +小号配合

文章 软文是自己幸苦的整理出来的 ,我们发布出去后,和你一样的同行 ,跟你后面抄 ,到处发 ,这个是肯定的

避免不了的 ,不管是短视频还是文章,都是非常容易被模仿的 ,所以 整理好一篇 发送出去后,

就马上需要全网发布 ,到处发 ,越多越好 ,这里面就需要大量的账号去辅助 。

如果你做引流 ,想 1 2 个号 就可以完成的可能性不大 ,就算你是某个领域的大V,也需要积累 ,

这个我们没有太多的时间去等 ,所以建立大小号,全网发布的策略是非常不错的 。



这里给大家推荐一个工具 ,可以大量的管理各个平台的账号 ,当然还有很多黑科技的功能,这里不做详细的介绍 。


整体的思路大概就这样 ,做一个总结 :

大号 正常每天更新 1-3篇,原创文章 ,原创文章 可以通过购买 专业写手

如果你水平可以的话 ,也可以自己写 。

小号与大号同步 ,各种小号,到处给大号导流,到处去贴广告 贴 ,封了也无所谓 ,

小号 给大号做点赞,引导客户评论 。


举报同行 :

举报有什么用?这里面大概举个例子说明下:

比如你是做母婴的,那么你在一个平台上面发文章,发内容 ,做客户导流,同样 ,你的同行也和你一样。

都在热火朝天的干,理想情况下,都相安无事。但是你长期观察就会发现 。同行跑得越来越快。

而你不是被删帖,就是被封号 ,做到自己怀疑人生 。越做越心慌!

那么为什么会出现这样的情况??自己内容不行么??但是同行也是这么发的呀?

这里面就涉及到一个举报问题了 。


也许你的同行,每天就跟着你屁股后面举报,不是一个号 ,而是一堆号去举报,

一篇文章,一个人举报 没有什么,但是有几十个人举报你,那么直接触发平台的危机处理机制,

直接删帖,因为平台是机器人在处理的,一天几百万的帖子,不可能人工去处理,一旦出现大量举报的 ,

先删除,或是屏蔽,不管你是否违规,因为平台如果真因为一个违法的帖子,导致平台被整顿(这个有先例的)

没有那个平台会冒这个风险,宁可错杀一千,不放一个 。


那么就很容易解释这个作用了,当你的对手都被举报了,你不就竞争压力降低了,把竞争对手灭了,

自己就活了,商场如战场,不是你死就是我活

我们举报通常用什么方法操作呢??

这个可以人工去操作。但是人工操作,特别烦 ,累 ,我们这里采用的是工具自动去检索 ,然后进行换号批量进行举报 。




当然还有很多的策略 ,这里就不一一的介绍了 ,这里免费分享一些引流相关的干货,有兴趣的 ,可以找我们要 :






有需要的可以参考下图找我交流

















let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

let t1 = of_eqs [(!1, !1)]
let%test _ = is_true t1
let t2 = of_eqs [(x, x)]
let%test _ = is_true t2
let%test _ = is_false (and_ f3 t2)
let%test _ = is_false (and_ t2 f3)
let r0 = true_
let%expect_test _ =
pp r0 ;
[%expect {| {sat= true; rep= [[-1 ↦ ]; [0 ↦ ]]} |}]
let%expect_test _ =
pp_classes r0 ;
[%expect {||}]
let%test _ = difference r0 (f x) (f x) |> Poly.equal (Some (Z.of_int 0))
let%test _ = difference r0 !4 !3 |> Poly.equal (Some (Z.of_int 1))
let r1 = of_eqs [(x, y)]
let%expect_test _ =
pp_classes r1 ;
pp r1 ;
[%expect
{|
%x_5 = %y_6
{sat= true; rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ = entails_eq r1 x y
let r2 = of_eqs [(x, y); (f x, y); (f y, z)]
let%expect_test _ =
pp_classes r2 ;
pp r2 ;
[%expect
{|
%x_5 = %y_6 = %z_7 = ((u8) %x_5)
{sat= true;
rep= [[%x_5 ↦ ];
[%y_6 ↦ %x_5];
[%z_7 ↦ %x_5];
[((u8) %x_5) ↦ %x_5];
[-1 ↦ ];
[0 ↦ ]]} |}]
let%test _ = entails_eq r2 x z
let%test _ = entails_eq (or_ r1 r2) x y
let%test _ = not (entails_eq (or_ r1 r2) x z)
let%test _ = entails_eq (or_ f1 r2) x z
let%test _ = entails_eq (or_ r2 f3) x z
let%test _ = entails_eq r2 (f y) y
let%test _ = entails_eq r2 (f x) (f z)
let%test _ = entails_eq r2 (g x y) (g z y)
let%test _ = difference (or_ r1 r2) x z |> Poly.equal None
let%expect_test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
pp r ;
pp s ;
pp rs ;
[%expect
{|
{sat= true;
rep= [[%w_4 ↦ ]; [%y_6 ↦ %w_4]; [%z_7 ↦ %w_4]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true;
rep= [[%x_5 ↦ ]; [%y_6 ↦ %x_5]; [%z_7 ↦ %x_5]; [-1 ↦ ]; [0 ↦ ]]}
{sat= true; rep= [[%y_6 ↦ ]; [%z_7 ↦ %y_6]; [-1 ↦ ]; [0 ↦ ]]} |}]
let%test _ =
let r = of_eqs [(w, y); (y, z)] in
let s = of_eqs [(x, y); (y, z)] in
let rs = or_ r s in
entails_eq rs y z
let r3 = of_eqs [(g y z, w); (v, w); (g y w, t); (x, v); (x, u); (u, z)]

九、微商如何销售日化用品?

就是拍摄一些日化用品的照片,和自己使用的照片,配上合适的文案发布到朋友圈。

十、微信母婴用品代理怎么搞的?

首先我们要弄清楚,母婴用品代理最重要的是什么?

1、靠谱的货源

2、靠谱的师傅

3、完善的售后

那些免费的,19.9的真不想评论,随便发你2张微信名片,拉个群完事。会有教学?会有售后?遇到点麻烦事情,直接就把你拉黑了!

收钱就是揽责,收的越多,责任越大!人家都没收你钱,肯定对你服务相当有限了!

团队收费388,主要是有以下几个保障

1、只要你在我推荐的货源下单,出了售后无法解决,我来沟通。遇到拿了钱不发货,我来垫付。

2、各种早教资料共享,用来引流或者自用都行。

3、在线培训平台进行学习,随时随地都能观看培训课程,有问题随时答疑解惑。

微信上卖母婴的真是很多,大家也都能很轻易的找到低价代发的渠道,但是,出了问题没人管才是最痛苦的。很多人为了省个代理费,不知道要吃多少亏~出了售后,群主直接把你踢出去真的发生太多这样的事情。淘宝有88会员,京东有PLUS会员,入个团队,就是你在母婴用品代理办的会员,出事有人罩,没出事有人聊,花钱买的是货源+售后+培训+师傅。

秋宝家在线学习平台
顶一下
(0)
0%
踩一下
(0)
0%
上一篇:返回栏目
热门图文