我有以下事实:
make(product_A, product_Z, product_Y).
make(P, X, Y) :- make(P, Y, X).
Run Code Online (Sandbox Code Playgroud)
我想确保产生product_A的半成品(即product_Z和product_Y)无论其在查询中的位置如何都是正确的.
所以我想要这个查询:
make(product_A, product_Y, product_Z).
Run Code Online (Sandbox Code Playgroud)
还有这个:
make(product_A, product_Z, product_Y).
Run Code Online (Sandbox Code Playgroud)
应该被Prolog视为等价物(相同) - 即使我没有将这两个案例作为事实放入Prolog的数据库中.换句话说,我想让参数(product_Z和product_Y)在查询中可以交换.
但是当我把代码放在开头时,Prolog似乎重复了一个无限循环.
那我该怎么做呢?
无限推导的原因是,只要你愿意,就可以将参数翻转回来(及时).您可以为翻转谓词引入新名称:
cmake(A,B,C) :- make(A,B,C).
cmake(A,B,C) :- make(A,C,B).
Run Code Online (Sandbox Code Playgroud)
与一次性解决方案相比,您保持逻辑纯净.
即使翻转参数有效,但对于两个以上的依赖项,您会以指数方式炸毁搜索空间(因为您需要覆盖n个参数的所有排列).作为替代方案,您可以将依赖关系的排序列表作为第二个参数传递.然后,您对输入进行一次排序并进行查找.