Ошибка потока символов пролога - PullRequest
2 голосов
/ 31 декабря 2010

Мой код должен останавливаться, когда он находит остановку в файле, из которого он читает, но это не так.Я получаю сообщение об ошибке:

% reads in a character and then checks whether this character is a blank,
% a carriage return or the end of the stream. In any of these cases a
% complete word has been read otherwise the next character is read.


calculate([stop],_) :- !.
calculate([],_):-!.
calculate([Word|Rest],X) :-
    word_to_number(Word,Symbol),
    concat(X,Symbol,NewX),
    calculate(Rest,NewX),
    atom_to_term(NewX,Eq,[]),
    print('Calculating '),print(NewX),print('  The result is: '),
    Result is Eq,
        print(Result),nl,
    execute.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 31 декабря 2010

Объявите «плюс», «минус» и «время» как операторы, и вы можете использовать read / 1 для непосредственного чтения терминов Пролога, так как в этом случае ввод допустим синтаксис Пролог.

1 голос
/ 31 декабря 2010

Проблема в том, что вычисление является рекурсивным.В некоторый момент вызывается calculate([one], '03+'), что, в свою очередь, вызывает calculate([], '03+1'), что дает результат (4).Затем он вызывает execute и обрабатывает остальную часть ввода.

Затем , вычисление вызова выполняется успешно, и теперь продолжается применение atom_to_term к '03+', что дает ошибку.

Это можно исправить, переместив преобразование в атом в отдельный предикат:

to_atom([Word], Symbol) :- word_to_number(Word, Symbol).
to_atom([Word|Rest], Term) :-
    word_to_number(Word,Symbol),
    to_atom(Rest, Symbol2),
    concat(Symbol,Symbol2,Term).

...
calculate(List) :-
    to_atom(List, NewX),
    atom_to_term(NewX,Eq,[]),
    ...

Тогда в начале вам также не понадобится фиктивная 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...