查询数据库时成功与失败

时间:2015-01-28 06:36:22

标签: prolog prolog-toplevel

所以我坚持做一个我一直在努力的练习。我有以下事实:

sd(appleseed0, appleseed1).

sd(appleseed0, apple1).
sd(appleseed1, apple1).
sd(appleseed2, apple1).

sd(appleseed0, apple2).
sd(appleseed1, apple2).
sd(appleseed2, apple2).

这意味着appleseed1来自appleseed0,apple1来自appleseed0等。我遇到的问题是,如果值被切换,我需要打印出false。意思是,我希望查询结果为" true"当查询是seed(appleseed0, apple1)然后" false"当查询的顺序与seed(apple1, appleseed0).

相反时

现在,我的谓词看起来像这样:

seed(A,B) :- sd(A,B) ; sd(B,A).

我理解这就是为什么我的查询返回true,无论顺序如何,但我唯一的另一个想法是:

seed(A,B) :- sd(A,B). 

但我不能这样写,因为这会使它成为无限循环,没有错误。我怎样才能使查询产生" true"当显示类似seed(appleseed2, apple2)和" false"用seed(apple2, appleseed2)

之类的东西显示

1 个答案:

答案 0 :(得分:1)

希望我正确地阅读你的问题:

您不需要额外的谓词。实际上,您正在寻找的是查询:

?- sd(A, B).

这将成功或失败,就像你描述的那样。谓词

seed(A, B) :-
    (   sd(A, B)
    ;   sd(B, A)
    ).

(就像你的,只是格式化以便更容易理解)读取:“seed(A, B)为真时sd(A, B)为真。当sd(B, A)为真时也是如此”(如你注意到了)。一个有趣的副作用是,如果您在数据库中有这两个事实:

sd(foo, bar).
sd(bar, foo).

然后查询:

?- 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)为真。”