我想检查两个术语,如果它们可以通过=/2
匹配,并且在检查期间不应该绑定任何变量。
例如:match_chk/2
| ?- match_chk(X, a).
true. % without any binding
这可以通过两次使用非对称subsumes_term/2来完成,但这似乎效率低下,因为可能需要扫描两次。
match_chk(A, B) :-
( subsumes_term(A, B)
; subsumes_term(B, A)
), !.
答案 0 :(得分:1)
由于Prolog将否定视为失败实现否定,当\+ Goal
成功时,不会返回任何绑定。如果你想知道两个术语是否是 unifiable ,你可以简单地使用双重否定:
unifiable(Term1, Term2) :-
\+ \+ Term1 = Term2.
或者,如果您愿意,可以像@passaba por aqui评论一样:
unifiable(Term1, Term2) :-
\+ Term1 \= Term2.