Пролог читать сложный термин и рассматривать его как выражение - PullRequest
0 голосов
/ 16 декабря 2011

Следующий код не работает

:- 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).

Почему это? Похоже, функция чтения не работает должным образом

Ответы [ 2 ]

3 голосов
/ 16 декабря 2011

из списка рассылки SWI-Prolog ([SWIPL] Ann: SWI-Prolog 5.11.23, 23 июня):

  • ИЗМЕНЕНО: пользовательские арифметические функции были удалены изядро.Существует новая библиотека (арифметика), которая имитирует старое поведение ЧАСТИЧНО.В частности:

    • Эта библиотека должна быть загружена перед использованием arithmetic_function / 1.
    • Она охватывает только арифметические функции, которые видимы в качестве аргумента для is / 2,> / 2 и т. Д.. во время компиляции.
    • Новый предикат arithmetic_expression_value / 2 может использоваться для оценки выражений со встроенной пользовательской арифметикой, которые создаются во время выполнения.
1 голос
/ 16 декабря 2011

Ну, как пример, когда я тестирую его с помощью 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 здесь, для протокола!

У других могут быть подсказки о том, почему у нас это не получается!

...