LearnPrologNow编译器无法按预期工作

时间:2016-02-03 13:17:21

标签: prolog

这将是我关于Stack Overflow的第一个问题 我正在阅读learnPrologNow手册,然后我开始在第3章进行练习,我的编译器给出的答案不是我所期望的(我认为不应该出现的是什么)。所以我用本书给我的例子测试了它:
知识库:

child(anne,bridget).
child(bridget,caroline).
child(caroline,donna).
child(donna,emily). 
descend(X,Y)  :-  child(X,Y).
descend(X,Y)  :-  child(X,Z), descend(Z,Y).

所以我问编译器:

12 ?- descend(bridget,caroline).
true ;
false.

13 ?- descend(caroline,bridget).
false.

第二个假(12个)来自哪里?这也发生在例外情况3.2(我从GitHub页面中检查正确的那个)的知识库中:

greater_than(succ(X),0).
greater_than(succ(X),succ(Y)) :-
          greater_than(X,Y).

答案:

14 ?- [ex32].
Warning: c:/users/user/documents/prolog/ex32.pl:1:
        Singleton variables: [X]
true.

15 ?- greater_than(3,2).
false.

16 ?- greater_than(2,3).
false.

我使用的是SWI-Prolog 7.2.3 64位版本 有什么建议可能是错的吗?

2 个答案:

答案 0 :(得分:3)

另一个答案解释了你的第一个问题。第二个问题是不同的。你应该在后继符号中使用自然数,所以你需要使用0, succ(0), succ(succ(0)), succ(succ(succ(0))), ...而不是0,1,2,3 ......,而不是{。}}。

这是较早出名的早期Prolog示例之一,你可以在Stack Overflow上找到很多关于它的问题,以及其他在线的例子。我个人的观点是,在继承符号中进行算术只是疯了,但如果你有兴趣,可以尝试搜索“peano算术”,或者“继承算术”,like this

如果您想进行算术比较,请使用arithmetic predicates。有了这些,你可以比较数字和算术表达式:

?- 2 > 3.
false.

?- 3 < 4.
true.

?- 1+2+3 =< 6.
true.

为了比较任意术语,您可以使用在standard order of terms上进行比较的谓词。请注意,对于某些情况,您将获得不同的答案:

?- 1+2 > 99999.
false.

?- 1+2 @> 99999.
true.

文档解释了原因。顺便说一句,它还解释了如果使用标准的术语顺序,为什么后继符号中的自然数字会正确比较:

?- s(s(0)) @> s(0).
true.

?- s(s(0)) @< s(0).
false.

答案 1 :(得分:2)

第二个false结果来自SWI Prolog试图继续推断信息。

在第一个true之后,您点击空格键,然后SWI Prolog开始回溯以查看它可以推断出的其他内容。它无法建立descend(bridget,caroline)派生,因此这次结果为false,并且回溯结束。