比如a等于b,则b等于a.像这样的不能简单写成foo(A,B):-foo(B,A).这样会死循环出错。关键在于控制递归的次数,在搜索foo(A,B)无结果后搜索foo(B,A),在foo(B,A)也失败后停止,不继续再搜索foo(A,B)。
foo(a,b).
foo(c,d).
foo(A,B):-
flag(foo) ->
(
retract(flag(foo)),
fail
)
;
(
assert(flag(foo)),
foo(B,A),
retract(flag(foo))
).
测试结果:
?- foo(b,a).
yes
?-foo(a,z).
no