Prolog 中的高效 match_chk/2 谓词

An efficient match_chk/2 predicate in Prolog

我想检查两个术语是否可以被 =/2 匹配,并且在检查期间不应绑定任何变量。

例如:match_chk/2

| ?- match_chk(X, a).
true. % without any binding

这可以通过使用非对称 subsumes_term/2 两次来完成,但这似乎效率低下,因为可能需要扫描术语 2 次。

match_chk(A, B) :-
    ( subsumes_term(A, B)
    ; subsumes_term(B, A)
    ), !.

由于 Prolog 将否定实现为 将否定实现为失败,当 \+ Goal 成功时,不返回任何绑定。正如您想知道两个术语是否 unifiable,您可以简单地使用 double negation:

unifiable(Term1, Term2) :-
    \+ \+ Term1 = Term2.

或者,如果您愿意,如@passaba 或 aqui 评论:

unifiable(Term1, Term2) :-
    \+ Term1 \= Term2.