2017-10-02 5 views
1

Quelqu'un est-il au courant d'un built-in ou de toute autre manière qui fera que prolog aller à la clause suivante lorsque l'entrée du terminal est donné? Ainsi, par exemple, celui qui donnera la requête devra appuyer sur le bouton y pour passer à la clause suivante après que la requête a été trouvée.Prolog Start clauses seulement après l'entrée

+0

Vous pouvez construire une méta-interprète qui fait cela avec moins de douleur que vous attendez probablement. –

+0

[Voici un article] (https://www.cs.unm.edu/~luger/ai-final2/CH6_Three%20Meta-Intrepeters%20-%20Prolog%20in%20Prolog,%20EXSHELL,%20and%20a%20Planner .pdf) qui discute quelques variations sur la façon d'aborder ceci, permettant même à l'utilisateur de spécifier si une clause est vraie ou non. –

Répondre

0

C'est la soi-disant méta-interprète à la vanille (I cribbed de this answer by Jan Burse):

solve(true) :- !. 
solve((A,B)) :- !, solve(A), solve(B). 
solve(H) :- clause(H,B), solve(B). 

Vous pouvez étendre à attendre une entrée en ajoutant un prédicat de demander l'entrée avant de poursuivre:

confirm :- write('Continue? [y/n] '), flush_output, get_char(y). 

remplacer maintenant la deuxième clause avec ceci:

solve((A,B)) :- !, solve(A), confirm, solve(B). 

Modifier: I asked how to add built-ins et a obtenu une réponse que vous pouvez simplement ajouter cette clause:

solve(T) :- call(T). 
+0

Merci beaucoup! J'ai seulement un mois d'expérience en prologue, donc je dois d'abord comprendre votre code. Quoi qu'il en soit, mon proffesor m'a dit que cela pouvait aussi être fait avec read/1 que pensez-vous de cela? –

+0

@WillemvanderSpek 'read/1' va lire un terme entier, donc l'utilisateur devra entrer un point et une nouvelle ligne, et vous devrez tolérer l'invite de Prolog. Mais essayez 'read (y)' au lieu de 'get_char (y)' et voyez ce qui se passe. –