【问题标题】:Prolog program - list of Peano numbers - rule returns multiple answersProlog 程序 - Peano 数字列表 - 规则返回多个答案
【发布时间】: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


【解决方案1】:

请参阅this answer。首先得到true,然后在回溯后得到false,只是意味着它找到了答案,然后应您的要求尝试了不同的路径,然后找不到任何其他路径到达@ 987654324@,所以返回false

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

false 响应对于 Prolog 初学者来说可能看起来不一致,并且“感觉”为错误或警告,但它实际上是一个完全正常的 Prolog 响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多