如何告诉 Prolog 两个文字是等价的

How to tell Prolog that two literals are equivalent

谁知道如何告诉 Prolog n(n(p))n(p) 代表相同的东西?

或者如何将n(n(p))减少到n(p)

Anyone knows how to tell Prolog that n(n(p)) and n(p) represent the same thing?

Prolog 的统一系统对于两个事物何时相同具有明确的含义。 n(n(p))n(p) 不是一回事。您可以构造一个谓词来定义比 (=)/2.

更通用的等价关系

通常在 Prolog 中,如果两个常量具有不同的名称,则它们是不同的。只有当函子相同(函子名称和参数个数)且参数相等时,两个复合项才相同。

因此我们可以定义一个谓词:

equiv_(n(n(p)), n(p)).

equivalence(L, R) :-
    equiv_(L, R).
equivalence(L, R) :-
    equiv_(R, L).
equivalence(L, L).

如果你匹配 equivalence(n(n(p)), n(p)),它将 return true

@false Can't I define a predicate n(n(p)) that returns n(p). What I want, in fact, is that all occurrences of the within a list to be replaced with the latter.

如果第一个参数是 n(n(p)):

,您可以创建一个将第二个参数与 n(p) 统一的谓词
replace_nnp(X, n(p)) :-
    X == n(n(p)).
replace_nnp(X, X) :-
    X \== n(n(p)).

然后我们可以使用maplist/3 [swi-doc]将一个项目列表映射到另一个项目列表:

replace_nnp_list(LA, LB) :-
    <b>maplist(</b>replace_nnp, LA, LB<b>)</b>.

例如:

?- replace_nnp_list([n(n(p)), p, n(p), n(n(p))], X).
X = [n(p), p, n(p), n(p)] ;
false.