2010-12-31 5 views
2

Je suis en train de faire une calculatrice de mot .. lire les mots d'un fichier .. les traduire en chiffres, puis calculer le résultat .. i a réussi à faire tout cela, mais je pense avoir deux bugs dans mon programme ..Prolog Backtracking

J'ai principalement deux fonctions ...

extrait (mots), (mots, calculate 0). L'extrait lira à partir du fichier .. et renverra une liste de mots .. ex: [un, plus, trois] .. maintenant calculera traduira la valeur de ces mots en nombres et calculera. i a réussi à faire aussi .. maintenant les bugs sont: je dois arrêter de lire et de mettre fin si je rencontre arrêt dans le fichier .. donc si Words était [arrêt] Fin. i essayé ce qui suit ...

execute :- 
extract(Words), 
Words = [stop],nl,print('Terminating ...'),!. 
execute :- 
extract(Words), 
calculate(Words,0). 

se termine avec succès .. mais il permet de sauter les lignes que j'extraire plus d'une fois .. j'ai essayé de le faire ..

execute :- 
extract(Words), 
Words \= [stop],execute(Words). 
execute(Words) :- 
calculate(Words,0). 

si les mots n'est pas arrêter .. alors allez et calculez .. mais ça ne marche pas !!

j'apprécie l'aide .. Merci Vous

Répondre

3

effets secondaires (ici: la lecture d'un fichier et de passer à la prochaine législature) ne sont pas défaits sur retours en arrière. Vous pouvez lire une fois, puis faire le choix en fonction de la durée de lecture avec if/then/else ou un prédicat auxiliaire, par exemple:

execute :- 
     extract(Words), 
     ( Words == [stop] -> nl, write('Terminating ...') 
     ; calculate(Words, 0) 
     ). 

Dans SWI-Prolog, envisagez d'utiliser library(pio) pour le fichier pur lecture décrit par , qui gère backtracking comme prévu.

+0

Merci pour la réponse .. Je l'ai essayé de le faire .. il rattrape l'arrêt .. l'impression .. mais il continue à lire .. Je veux arrêter l'analyse du fichier et thats it .. Je ne peux pas juste dit vu, dit, après cela pour arrêter de lire .. merci beaucoup .. j'apprécie votre aide – AhmadAssaf

+1

s (X) pour la référence à 'pio'. – repeat