2009-11-08 3 views
5

Ho un piccolo programma scritto in Prolog. Al momento posso stampare il primo risultato conCiclo Prolog anche se risultati variabili

test(X, 1, 4, 5). 
write(X). 

Ma se c'è più di un risultato per X, Come faccio a stampare i prossimi?

Grazie.

risposta

7

utilizzare un ciclo fallimento-driven:

test(X, 1, 4, 5), writeln(X), fail ; true. 

o lo stesso in maniera più leggibile, utilizzando forall/2:

forall(test(X, 1, 4, 5), writeln(X)). 

Non v'è alcuna necessità di costruire un elenco di tutte le soluzioni (questo è ciò che findall/3 è per), a meno che non sia necessario questo elenco per qualcosa di diverso dalla semplice stampa.

Se il Prolog non ha forall/2 poi attuarlo se stessi nel modo seguente:

forall(A, B) :- 
    \+ (call(A), \+ call(B)). 
+0

non sembra esistere in GNU-Prolog, ma il ciclo guidato da errori funziona bene. Grazie. – Kutzi

+0

@Kutzi: ho aggiunto l'implementazione di forall/2 – Kaarel

2

Intendi automaticamente? È possibile emettere un comando di backtrack con; e torna indietro e ottiene il valore successivo. Ma se vuoi stampare più risultati all'interno del programma, allora usi la ricorsione. Fornisci ulteriori dettagli su ciò che stai cercando di fare.

AGGIORNAMENTO: non è possibile emettere;. Devi scrivere una procedura per "eseguire il loop" attraverso i risultati, quindi potresti volere i risultati in un elenco.

printList([]) :- write(""). 
    printList([H|T]) :- write(H), printList(T). 
+0

voglio l'applicazione per rilasciare; comando per eseguire il ciclo dei risultati. –

+0

L'esempio contiene un errore di sintassi: sostituire ';' con '.'. Ma anche dopo aver corretto questo errore, il programma non funziona correttamente, ad es. "? - printList ([a, b, c])." emette "abc []" dove probabilmente non è richiesto il trailing "[]". – Kaarel

2

Se si desidera ottenere ogni soluzione per una variabile in una chiamata senza dover premere continuamente ';' per la soluzione successiva, è possibile utilizzare il predicato findall in questo modo:

findall(X,test(X,1,4,5),L). 

Il primo argomento specifica quale variabile si vorrebbe raccogliere tutti i valori di, il secondo argomento è il predicato insieme con i suoi argomenti che si desidera per trovare tutte le soluzioni per, e il terzo argomento sarà una lista di tutti i valori di X da tutte le soluzioni.

Quindi da qui è possibile stampare solo i valori di L se si è soddisfatti del risultato formattato come elenco. Altrimenti avrete bisogno di scrivere un predicato ricorsivo per stampare il contenuto di L nel modo che volete, come sottolinea Vincent Ramdhanie.