Prolog 查询数据库时的成功与失败
所以我一直在做一个练习。我有以下事实:Prolog 查询数据库时的成功与失败,prolog,prolog-toplevel,Prolog,Prolog Toplevel,所以我一直在做一个练习。我有以下事实: sd(appleseed0, appleseed1). sd(appleseed0, apple1). sd(appleseed1, apple1). sd(appleseed2, apple1). sd(appleseed0, apple2). sd(appleseed1, apple2). sd(appleseed2, apple2). 这意味着applesed1来自applesed0,apple1来自applesed0,等等。我遇到的问题是,如
sd(appleseed0, appleseed1).
sd(appleseed0, apple1).
sd(appleseed1, apple1).
sd(appleseed2, apple1).
sd(appleseed0, apple2).
sd(appleseed1, apple2).
sd(appleseed2, apple2).
这意味着applesed1来自applesed0,apple1来自applesed0,等等。我遇到的问题是,如果值被切换,我需要它打印为false。也就是说,当查询是seed(applesed0,applesed0)
时,我希望查询结果为“true”,然后当查询的顺序与seed(applesed0,applesed0)相反时,查询结果为“false”。
现在,我的谓词如下所示:
seed(A,B) :- sd(A,B) ; sd(B,A).
我明白这就是为什么无论顺序如何,我的查询都返回true,但我唯一的其他想法是:
seed(A,B) :- sd(A,B).
但我不能这样写,因为这会使它成为一个无限循环,没有错误。我如何才能使查询在使用
seed(applesed2,applesed2)
之类的内容显示时显示为“true”,在使用seed(applesed2,applesed2)
之类的内容显示时显示为“false”?希望我能正确阅读您的问题:
您不需要额外的谓词。事实上,您需要的是查询:
?- sd(A, B).
?- seed(foo, bar).
这将成功或失败,正如你所描述的。谓词
seed(A, B) :-
( sd(A, B)
; sd(B, A)
).
(就像你的一样,只是格式化为更容易理解)读到:“seed(A,B)
在sd(A,B)
为真时是真的。当sd(B,A)
为真时也是真的”(就像你已经注意到的)。一个有趣的副作用是,如果数据库中有以下两个事实:
sd(foo, bar).
sd(bar, foo).
然后查询:
?- sd(A, B).
?- seed(foo, bar).
将成功两次(!),就像查询一样
?- seed(bar, foo).
或等效的顶级查询
?- sd(bar, foo) ; sd(foo, bar).
最后一个查询最明显地说明了为什么查询会成功两次
让我困惑的是:你为什么这么认为
seed(A, B) :-
sd(A, B).
会导致无限循环吗?节目中有没有你没有展示的部分?目前,定义这样的谓词相当于给
sd/2
一个别名,seed/2
。这个定义是:“seed(A,B)
在sd(A,B)
为真时为真。”啊,这是有道理的。我混淆了自己(1)种子(A,B):-种子(A,B),我没有考虑(2)种子(A,B):-SD(A,B)。我假设,由于(1)将产生一个“无限循环”,其中没有错误,那么(2)将做同样的事情,因为它似乎在做(1)正在做的同样的事情。从逻辑上讲,(2)是有道理的。你的移植消除了我的困惑。非常感谢。我不熟悉Prolog,所以这对我的学习很有价值!如果“apple1来自applesed0”,为什么apple1也来自applesed1?sd/2现在的含义并不清楚。