2016-05-08 24 views
2

Ich folge Prolog Tutorial 2.1.Prolog: Erhalte alle möglichen Werte einer Variablen

Programm

adjacent(1, 2). 
adjacent(1, 3). 
adjacent(1, 4). 

main:- 
    adjacent(1, R), 
    write(R). 

druckt 2.

Aber es setzt nach dem Tutorial eine Liste der möglichen Werte drucken:

?- adjacent(1,2). 
yes 
?- adjacent(1,3). 
no 
?- adjacent(1,R). 
R = 2 ; 
R = 3 ; 
R = 4 ; 
no 

ich wieder nur in repl versuchen, das gleiche Ergebnis zu erhalten:

?- adjacent(1, R). 
R = 2 . 

Wie könnte ich/eine Liste möglicher Werte einer Variablen ausdrucken?

+1

Sie drückten Zurück! Drücken Sie Space, um die nächste Antwort zu erhalten. – false

+0

'angrenzend (1,3) .' hätte zu" ja "führen müssen. Da ist etwas, das du nicht richtig gemacht hast, was nicht sichtbar ist. – lurker

+0

@false Ich mache es in repl, aber wie könnte diese Werte erhalten, wenn Sie das Programm als Skript wie 'Swipl -q -f Adjacent.pl -t Haupt 'ausführen? – Wentao

Antwort

0

In swipl, Bibliothek (apply) ist - standardmäßig - automatisch geladen, so können Sie

 
main:- 
    forall (adjacent(1, R), (write(R),nl)). 

Notiz schreiben: Aktion ein conjuction ist, für nur erforderlich, um die richtige Syntax zu verdeutlichen. Für jeden praktischen Zweck könnte main :- forall(adjacent(1, R), writeln(R)). besser sein.

0

Sie benötigen eine Ausfall-Schleife:

adjacent(1, 2). 
adjacent(1, 3). 
adjacent(1, 4). 

main :- 
    adjacent(1, R), 
    write(R), nl, 
    fail. 
main. 

Dies ist eine grundlegende Programmiertechnik in Prolog. fail/0 wird das Zurückverfolgen erzwingen, also wird die nächste angrenzende/2-Lösung untersucht (und so weiter). Die zweite Klausel zu main/0 verhindert, dass die Schleife selbst ausfällt.

Verwandte Themen