Prolog程序 - Peano数字列表 - 规则返回多个答案

时间:2014-02-03 12:13:56

标签: prolog logic successor-arithmetics

我正在尝试编写一个带有规则good的Prolog程序,该规则带有一个列表,其中列表中的每个术语都是Peano编号。当且仅当列表中的每个元素都大于前一个元素时,该规则应该为真。

例如,以下示例应为真:

good([]).
good([0]).
good([0,s(0)]).
good([0,s(s(0))]).
good([0,s(0),s(s(0))]).

以下示例应该是假的:

good([s(0),0]).
good([0,s(0),0]).

这是我的代码:

plus(X,0,X).
plus(X,s(Y),s(Z)) :- plus(X,Y,Z).

geq(X,Y) :- plus(K,Y,X).
ge(X,Y) :- geq(X,Y), not(X = Y).

good([]).
good([X]).
good([H|T]) :- good(H,T).
good(X,[H|T]) :- ge(H,X), good(T).

但是,对于肯定查询good([0,s(0),s(s(0))]),true和false都是解决方案。

错误是什么?

1 个答案:

答案 0 :(得分:1)

请参阅this answer。首先获得true,然后在回溯后获得false,只是意味着它找到了答案,然后根据您的请求尝试了不同的路径,然后找不到任何其他路径到达true的路径,因此返回false

换句话说,正如那个回答者所说,

  

false响应可能看起来与开始Prolog程序员不一致,并且“感觉”像是错误或警告,但它实际上是一个完全正常的Prolog响应。