2017-05-27 4 views
0

Ich mache eine Prolog-Praxis, die aus this übernommen wird.Fehler beim Ein- und Ausgang in Prolog

Was ich jetzt tun möchte, ist die Eingabe und Ausgabe des Programms zu ändern.
Ich brauche das Programm auszuführen, indem diese in der Konsole eingeben:

goldbach(100, L). 

nur zum Beispiel, und ich muß die Taste [;] nächstes Ergebnis zu zeigen, wenn vorherige auf dem Bildschirm gedruckt wird.

L = [3, 97]; 
L = [11, 89]; 
L = .... 

jedoch, was ich machen möchte, ist wie folgt:

Input a number:100. 
L = [3, 97]. 
L = [11, 89]. 
..... 

, dass das Programm wird „Geben Sie eine Nummer:“ zuerst drucken und Ihre Eingabe lesen, dann automatisch alle möglichen Ergebnis auszudrucken .

Ich habe Abschnitte über Lese lesen() und schreiben, aber ich erhalte fehlschlagen, wenn ich diese hinzufügen:

read_gold :- 
    write('Input a number:'), 
    read(X), 
    write(goldbach(X, L)). 

Wie kann ich meinen Code beheben, um das Programm zu machen die Eingabe und Ausgabe zu erreichen, was ich will ? Danke für die Antwort.

+0

Sie möchten den Toplevel ändern oder neu implementieren. Definitiv zu komplex für einen Anfänger. – false

+0

Sie können nicht 'schreiben (goldbach (X, L))', um die Ergebnisse der Abfrage von 'goldbach (X, L)' zu bekommen. Prädikate geben keine Lösungen zurück, da Funktionen Werte zurückgeben. – lurker

Antwort

2

So etwas wird buchstäblich tun, was Sie verlangen, obwohl es normalerweise nicht ist, wie man Prolog Abfragen und Lösungen verwendet.

read_gold :- 
    write('Input a number:'), 
    read(X), 
    show_results(goldbach(X)). 

show_results(Query) :- 
    call(Query, L), 
    write('L = '), write(L), write('.'), nl, 
    fail. 
show_results(_). 

Eine sauberere Art und Weise alle Lösungen in einem Rutsch zu sammeln ist sie findall/3 mit der Liste hinzu:

read_gold(Solutions) :- 
    write('Input a number:'), 
    read(X), 
    findall(L, goldbach(X, L), Solutions). 

Oder ohne explizit aufgefordert:

read_gold(X, Solutions) :- 
    findall(L, goldbach(X, L), Solutions). 

und Abfrage als zum Beispiel:

?- read_gold(100, Solutions). 
Solutions = [[3, 97], [11,89], ...] 
+0

Die Verwendung von 'write/1' zum Schreiben von Begriffen ist ziemlich problematisch. Verwenden Sie lieber 'writeq/1' – false

+0

Danke für Ihre Antwort. Jetzt weiß ich, dass ich über Abfrage lesen sollte. Es ist eine gute und wichtige Sache, die meisten Probleme zu lösen. – Limoncool