2012-04-01 8 views
0

für eine Zuordnung Aufruf bin ich verpflichtet, ein regelbasiertes System zu testen Einhaltung einer fire_codeeine andere Klausel in Prolog mit gleichen Klausel Namen

roomHasFastExit ist mein Test-Klausel, wo die anderen sind Teil eines Gebäudeplan erstellen

Rm ist in diesem Fall gleich wotl1

roomHasFastExit(Rm):- hasDoor(Rm, Door), isa(Door, outsideDoor). 

hasDoor(wolt1, wodoorlt1c). 
hasDoor(wolt1, wodoorlt1exit). 
hasDoor(wolt1, wodoor115lt1). 

isa(wodoor115lt1, door). 
isa(wodoorlt1c, door). 
isa(wodoorlt1exit, outsideDoor). 

das Problem, das ich auftreten werde, wenn feststellen, dass die Tür, die ich angefordert entspricht nicht, ich brauche die nächste Tür zu überprüfen, ob ich die Klausel ich rekursiv aufrufen werde nur die gleiche Tür bekommen, also wie geht es mir? Schleife durch jede Tür und überprüfe, ob es konform ist.

Antwort

0

Ihr Code es ist schon ok:

?- roomHasFastExit(Rm). 
Rm = wolt1 ; 
false. 

Wenn Sie brauchen, um ‚Schleife durch jede‘ Aufzeichnung Ihrer Datenbank, Sie auswerten und nicht jede mögliche Alternative, die Ihre Abfrage erfüllt wirklich.

In Prolog diese relationale Sicht wird durch Backtracking erhalten, die exaustive Suche in Top-Down-Reihenfolge ermöglicht.

Auf der obersten Ebene des Interpreters implementieren Sie dies mit ';'

?- hasDoor(wolt1,X). 
X = wodoorlt1c ; 
X = wodoorlt1exit ; 
X = wodoor115lt1. 

Eine nützliche Bibliothek Prädikat, das eine vollständige Auswertung zwingt ist forall/2. Zum Beispiel

show_available_doors(Room) :- 
    forall(hasDoor(Room, Door), writeln(Door)). 

Ausgänge:

?- show_available_doors(wolt1). 
wodoorlt1c 
wodoorlt1exit 
wodoor115lt1 

Prolog verwenden Listen als Haupt syntaktisches Konstrukt wenn exprimierenden Algorithmen: findall/3 es ist die einfachere builtin dass Konstrukte Listen, vollständig Abfragen Auswertung:

?- findall(Door, hasDoor(Room, Door), Doors). 
Doors = [wodoorlt1c, wodoorlt1exit, wodoor115lt1].