Dynamic rule assertion in SWI-prolog
Ich versuche eine Regel hinzufügen, die dynamisch auf die knowledge base verwenden SWI-prolog, wo der Körper der Regel ist im Voraus nicht bekannt.
Die gewünschte Regel wie folgt aussieht:
rule(a) :- fact(1), fact(2).
Normalerweise würde man einfach sagen,
assert((rule(a):-fact(1),fact(2))).
aber das problem ist, dass der Sachverhalt wird beschlossen, zur Laufzeit(die Anzahl der Fakten ist auch nicht bekannt, vor der Geltendmachung).
Deshalb würde ich gerne wissen, ob es eine Möglichkeit gibt zu behaupten, eine Regel, wo der Körper besteht aus einer Liste von Fakten, wie [Tat(1),Tatsache(2)]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden wir eine Regel erstellen, die
newrule(X) :- w,x,y,z(X)
.Der Körper einer Regel ist ein Tupel, ein Konstrukt in der form (w,x,y...).
Für verschiedene aufbaulängen, beginnend mit keine Körper:
Tupel-operator ist der Komma(`,'), wie in ','(a,b) == (a,b).
--
Gibt es zwei Auflistungen. Die erste Auflistung der Ergebnisse aus
listing()
aufgerufen wird, increate_a_rule()
. Der 2. Eintrag ist von derlisting()
Befehl in der letzten Zeile.assert
Prädikat in dieser Antwort ist veraltet in SWI-Prolog.Vorgeschlagene änderung frayser ' s Liste:
Diese Klauseln vermeiden die Notwendigkeit für eine Ausnahme, wenn die erste variable wird eine leere Liste: es wird einfach fehlschlagen. Es bedeutet auch, werden Sie nie schlagen eine geltend machen, wenn backtracking.
Allerdings, Sie möglicherweise trotzdem WOLLEN die Ausnahme-Klausel in den Ort, so könnte man noch setzen Sie auf zu fangen Fällen, in denen eine versuchte Einigung mit [] gemacht wurde. (Es wird nicht schlagen, wenn es backtracking, aber.)