交换参数

Exchange parameters

我有以下事实:

    make(product_A, product_Z, product_Y).
    make(P, X, Y) :- make(P, Y, X).

我想确保制造 product_A 的半成品(即 product_Z 和 product_Y)是真实的,无论它们在查询。

所以我想要这个查询:

make(product_A, product_Y, product_Z).

还有这个:

make(product_A, product_Z, product_Y).

Prolog 应该将其视为等价物(相同)——即使我没有将这两种情况都作为事实放入 Prolog 的数据库中。换句话说,我希望参数(product_Z 和 product_Y)可以在查询中交换。

但是当我把代码放在开头的时候,Prolog好像在重复一个无限循环。

那么我该如何实现呢?

您需要在规则中添加 once,如下所示:

make(A, B, C) :- once(make(A, C, B)).

这样,它就停止处理事实,不会陷入死循环。

无限推导的原因是可以前后翻转参数(只要你愿意)。您可以为翻转谓词引入一个新名称:

cmake(A,B,C) :- make(A,B,C).
cmake(A,B,C) :- make(A,C,B).

与 once 的解决方案相比,您在逻辑上保持纯粹。

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