2012-12-02 2 views
3

Voici un programme Prolog simple pour montrer un problème que j'ai actuellement avec mon vrai code.Prolog - Ne pas retourner la valeur désirée

Je suis en train d'écrire un interprète Brainf * ck en Prolog, mais il ne retourne pas le droit Output

Je courais bf("+.", Output)

Rendement attendu - Output = [1]

rendement réel - Output = []. Perte sa valeur lorsqu'il revient à iterateProg(Prog,Output) en bf2

Programme

est la suivante:

bf2(Prog,Output):- 
    iterateProg(Prog,Output). 

iterateProg([],_):- !. 
iterateProg(Prog, Output):- 
    checkInstruction(Prog,Output, NewProg, NewOutput), 
    iterateProg(NewProg, NewOutput). 

checkInstruction([Plus|ProgTail],Output,ProgTail,Output):- 
    char_code('+',Plus) 
    %increase memory by 1 for printing later. 
    . 

checkInstruction([Period|ProgTail], Output, ProgTail, NewOutput):- 
    char_code('.',Period), 
    %take the value in memory from addition just now, we will assume it is 1 
    append(Output,[1],NewOutput). 
+0

Veuillez vérifier ma réponse. J'ai fait une erreur dans le commentaire. – nhahtdh

Répondre

1

Votre prédicat bf2(Prog, Output) a le sens de: ce programme Prog correspondent à cette sortie Output - de sorte que le Output dans le prédicat bf2 et aussi iterateProg devrait contenir la sortie complète.

Donc dans checkInstruction prédicat, les 2 premiers arguments doivent contenir le programme complet et la sortie complète, et les 2 derniers arguments doivent contenir le programme partiel et la sortie partielle correspondante.

Par conséquent, vous devez ajouter le [1] avec NewOutput, pour produire la sortie finale Output pour la deuxième règle de checkInstruction prédicat. Vous devez renommer le New... avec un nom différent - puisqu'il s'agit en fait du programme partiel/"queue" et de la sortie correspondante.

append([1], NewOutput, Output) 

Notez le pour (j'étais inexact dans le commentaire). [1] est la sortie de l'instruction en cours et doit précéder la sortie de l'instruction au ProgTail. Par ailleurs, le prédicat bf2 est inutile - puisqu'il appelle iterateProg avec exactement les mêmes arguments.

Une autre chose est iterateProg([],_) devrait être iterateProg([],[]) depuis un programme vide devrait correspondre à la sortie vide. (L'inverse n'est pas vrai, donc vous ne devriez jamais mettre une coupe ! ici, si vous avez appris à ce sujet).

+0

merci pour votre réponse! – ali

+0

J'ai un autre [question prologue] (http://stackoverflow.com/questions/13670798/prolog-list-of-charcodes-to-a-string-or-characters) si vous êtes intéressé. – ali

Questions connexes