【问题标题】:prolog unary numbers - evaluating expressionprolog 一元数 - 评估表达式
【发布时间】:2021-03-19 18:26:44
【问题描述】:

我正在尝试了解 Prolog,但我遇到了以下情况。我用以下方式定义了自然数(一元):

n(0).
n(s(X)) :- nat(X).

这意味着0是0,s(0)是1,s(s(0))是2等等......

然后我定义谓词添加:

add(0, Y, Y) :- nat(Y).
add(s(X), Y, s(Z)) :-
   add(X, Y, Z).

将两个一元数和结果存储添加到 Z。

现在我有以下谓词“测试”来证明我的问题:

test(s(0),0).

然后在解释中输入:

add(s(0),0,R). %result: R = s(0), which is correct

那我试试:

test(add(s(0),0,R), 0).

所以第一个参数应该导致 R = s(0),第二个参数是零,所以整个表达式应该被评估为 true,但 prolog 说 false。我想这与这一点有关,即“测试”谓词中的 add(s(0),0,R) 不会评估我的想法。谁能向我解释一下,或者最终提供一些描述这种行为的链接?谢谢你的帮助! 干杯。

【问题讨论】:

  • 您确定要使用 noth,n/1nat/1 吗?
  • 你在这里写的不是你的程序。有了这个程序,问题?- add(s(0),0,R)。将通过错误消息进行回答。

标签: prolog successor-arithmetics


【解决方案1】:

不,prolog 不会像您想象的那样工作。 当你问

?- test(add(s(0),0,R), 0).

prolog 试图找到一个匹配的子句。但是,您的数据库中没有匹配的子句,因为s(0)add(s(0),0,R) 不匹配。两个结构只有在具有相同函子时才能匹配。

s(0) 具有函子 s,而 add(s(0),0,R) 具有函子 add

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多