基本上,我想知道为什么我对新谓词g
的定义之一导致查询以“ false”结尾,而另一个定义直接跳回“?-”。
给出这样的数据库:
f(a,b).
f(b,c).
f(c,d).
我想产生一个新的谓词,该谓词表示f
的某种可传递闭包,此外还应包含有关如何创建元素的列表。即我想要一个g
这样的?- g(X,Y,Z).
会产生这样的结果:
g(a,c,[f(a,b),f(b,c)]).
g(b,d,[f(b,c),f(c,d)]).
g(a,d,[f(a,b),f(b,c),f(c,d)])
我介绍了一个辅助连接谓词:
con([],L,L).
con([X|L1],L2,[X|C]):-con(L1,L2,C).
然后我尝试解决的方法是:
g(X,Z,[f(X,Y),f(Y,Z)]):-f(X,Y),f(Y,Z).
g(X,Z,C):-f(Y,Z),g(X,Y,L),con(L,[f(Y,Z)],C).
在产生正确输出的同时,最后还会打印另外false.
:
?-g(X,Y,Z).
X = a,
Y = c,
Z = [f(a, b), f(b, c)] ;
X = b,
Y = d,
Z = [f(b, c), f(c, d)] ;
X = a,
Y = d,
Z = [f(a, b), f(b, c), f(c, d)] ;
false.
像这样的简单定义:
g(X,Y):-f(X,Y).
产生
g(a,b).
g(b,c).
g(c,d).
没有'false'。
这是否意味着我的程序有错误?如果是,那是什么?