Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 查询数据库时的成功与失败_Prolog_Prolog Toplevel - Fatal编程技术网

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现在的含义并不清楚。