交换参数

for*_*erg 1 prolog

我有以下事实:

    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似乎重复了一个无限循环.

那我该怎么做呢?

lam*_*y.x 6

无限推导的原因是,只要你愿意,就可以将参数翻转回来(及时).您可以为翻转谓词引入新名称:

cmake(A,B,C) :- make(A,B,C).
cmake(A,B,C) :- make(A,C,B).
Run Code Online (Sandbox Code Playgroud)

与一次性解决方案相比,您保持逻辑纯净.

即使翻转参数有效,但对于两个以上的依赖项,您会以指数方式炸毁搜索空间(因为您需要覆盖n个参数的所有排列).作为替代方案,您可以将依赖关系的排序列表作为第二个参数传递.然后,您对输入进行一次排序并进行查找.