2 votes

Erreur de flux de caractères Prolog

Mon code est censé s'arrêter lorsqu'il trouve un arrêt dans le fichier qu'il lit, mais ce n'est pas le cas. Je continue à obtenir une erreur :

% 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.

Toute aide serait grandement appréciée !

2voto

mat Points 7998

Déclarez "plus", "moins" et "fois" comme opérateurs, et vous pouvez utiliser read/1 pour lire directement les termes Prolog, puisque l'entrée est alors une syntaxe Prolog valide.

1voto

Martin v. Löwis Points 61768

Le problème est que le calcul est récursif. À un moment donné, calculate([one], '03+') appelé, qui à son tour appelle calculate([], '03+1') ce qui donne le résultat (4). Il invoque ensuite execute et traite le reste de l'entrée.

Puis le calcul d'appel réussit, et passe maintenant à l'application de atom_to_term a '03+' ce qui donne l'erreur.

Vous pouvez résoudre ce problème en déplaçant la conversion en atome dans un prédicat séparé :

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,[]),
    ...

Dans ce cas, vous n'aurez pas non plus besoin du 0 fictif au début.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X