【问题标题】:Prolog - some basic arithmetic operations implementation [duplicate]Prolog - 一些基本的算术运算实现[重复]
【发布时间】:2016-03-19 13:45:36
【问题描述】:

我是 Prolog 的新手,需要在不使用内置谓词的情况下对自然数实现一些基本的算术运算。

我用一元表示法表示自然数 Term,这意味着我有常数 0,以及递归后继函子 s [即4 = s(s(s(s(0))))]。关于上述符号,我实现了算术运算。

规则集是:

% nat(N)/1 ---> N is a natural number
nat(0).
nat(s(X)) :-
    nat(X).

% add(X,Y,Z)/3 ---> Z = X + Y
add(X,0,X) :-
    nat(X).
add(X,s(Y),s(Z)) :-
    add(X,Y,Z).

% mult(X,Y,Z)/3 ---> Z = X * Y
mult(0,X,0) :-
    nat(X).
mult(s(X),Y,Z) :-
    mult(X,Y,XY),
    add(XY,Y,Z).

现在,当我查询时:

?- mult(s(s(0)), s(s(s(0))), RES).

一切正常:

RES = s(s(s(s(s(s(0))))))。

当我查询时:(喜欢问 6/3=?)

?- mult(X, s(s(s(0))), s(s(s(s(s(s(0))))))).

我陷入了无限循环并得到了 S.O.

即使我在 mult 谓词中更改递归调用的顺序也无济于事:

mult(s(X),Y,Z) :-
    add(XY,Y,Z),
    mult(X,Y,XY).

我在 linux 机器上运行 swi-prolog。

非常感谢您的建议!

【问题讨论】:

    标签: prolog successor-arithmetics non-termination


    【解决方案1】:

    好的,有一个快速修复(错误的递归):

    % add(X,Y,Z)/3 ---> Z = X + Y
    add(0,X,X) :-
        nat(X).
    add(s(X),Y,s(Z)) :-
        add(X,Y,Z).
    

    然后是 mult:

    mult(s(X),Y,Z) :-
       add(XY,Y,Z),
       mult(X,Y,XY).
    

    会给出想要的结果。

    然而,对于查询:

    ?- mult(X,Y,s(s(s(s(s(s(0))))))).
    

    它会输出所有对应于:X * Y = s(s(s(s(s(s(s(0)))))))的X,Y对,并且在最后一对之后,将进入无限循环,对我来说是未知的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2012-11-30
      • 2020-07-16
      • 2019-07-21
      • 2014-01-13
      相关资源
      最近更新 更多