【发布时间】:2014-02-03 12:13:56
【问题描述】:
我正在尝试编写一个带有规则 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))]),真假都是解。
什么是错误?
【问题讨论】:
-
替代解决方案:
good(L) :- msort(L,L). -
@ssBarBee:
msort/2应替换为sort/2。元素只需要更大。
标签: prolog logic successor-arithmetics