0

以下代码不起作用

:- arithmetic_function(i/2).

i(X,Y,Z) :-
         Z is X+Y.


calcola :-
        write('Give me an expression'),nl,
        read(ESP),
        Z is ESP,nl,nl,
        write(Z).

但以下是

:- arithmetic_function(i/2).

i(X,Y,Z) :-
         Z is X+Y.


calcola :-
        write('Give me an expression'),nl,
        Z is 4 i 2,nl,nl,
        write(Z).

这是为什么?似乎“读取”功能无法正常工作

4

2 回答 2

3

来自 SWI-Prolog 邮件列表([SWIPL] Ann: SWI-Prolog 5.11.23, 23 Jun):

  • 修改:用户定义的算术函数已从内核中删除。有一个新的库(算术)可以部分模拟旧的行为。尤其:

    • 必须在使用算术函数/1 之前加载此库。
    • 它仅涵盖在编译时作为 is/2、>/2 等参数可见的算术函数。
    • 一个新的谓词算术表达式值/2 可用于评估具有嵌入式用户算术的表达式,这些算术在运行时被实例化。
于 2011-12-16T19:23:33.153 回答
1

作为一个线索,当我用它测试is/2它失败但当我使用arithmetic_expression_value/2它时成功:

:- arithmetic_function(i/2).

:- op(20, xfx, i).

i(X, Y, Z) :-
    Z is X + Y.

calcola :-
    writeln('Give me an expression'),
    read(ESP),
    arithmetic_expression_value(ESP, Z), nl,
    write(Z).

对于@gusbro,它开箱即用。我在这里使用 windows swi-pl,作为记录!

其他人可能知道为什么它对我们失败了!

于 2011-12-16T17:32:48.470 回答