我有这些条款:
a(1).
a(2).
b(a).
c(A,B,C) :- a(A),d(B,C).
c(A,B,C) :- b(A),d(B,C).
d(B,C) :- a(B),!,a(C).
d(B,_) :- b(B).
当我运行查询 c(X,Y,Z) 时,答案是:
X = 1, Y = 1, Z = 1 ;
X = 1, Y = 1, Z = 2 ;
X = 2, Y = 1, Z = 1 ;
X = 2, Y = 1, Z = 2 ;
X = a, Y = 1, Z = 1 ;
X = a, Y = 1, Z = 2.
所以基本上,切割运算符(在这里 d(B,C) :- a(B),!,a(C).)忽略了最近的选择点,即它不会进一步搜索 d() 和一个()。我认为剪辑忽略了所有先前的选择点并且不会进行任何回溯。
有人可以解释确切的行为,为什么我错了?