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、6 月 23 日) から:

  • 変更: ユーザー定義の算術関数がカーネルから削除されました。古い動作を部分的にエミュレートする新しいライブラリ (算術) があります。特に:

    • このライブラリは、算術関数/1 を使用する前にロードする必要があります。
    • コンパイル時に is/2、>/2 などの引数として表示される算術関数のみを対象としています。
    • 実行時にインスタンス化されるユーザー算術演算が組み込まれた式を評価するために、新しい述語arithmical_expression_value/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 に答える