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.
我想检查两个术语是否可以被 =/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.