如何告诉 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.
谁知道如何告诉 Prolog n(n(p))
和 n(p)
代表相同的东西?
或者如何将n(n(p))
减少到n(p)
?
Anyone knows how to tell Prolog that
n(n(p))
andn(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 returnsn(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.