这将是我关于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位版本 有什么建议可能是错的吗?
答案 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
,并且回溯结束。