2015-05-25 3 views
5

Ich habe gerade eine Verbindung zu SWI Prolog hergestellt und möchte Fakten manipulieren. z.B. ziehe sie zurück und setze sie durch.Prolog C# Schnittstelle aus Datei zurückziehen

Ich habe eine Funktion wie folgt aus:

 String[] param = { "-q" }; 
     PlEngine.Initialize(param); 
      PlQuery.PlCall("consult('tablets.pl')."); 

      PlQuery.PlCall("assert(tablet(4,newatomic))."); 
      PlQuery.PlCall("tell('tablets.pl'), listing(tablet/2), told."); 
      PlQuery.PlCall("retractall(tablet/2)."); 
      PlQuery.PlCall("assert(tablet(1,n1ewatomic))."); 
      PlQuery.PlCall("assert(tablet(2,n2ewatomic))."); 
      PlQuery.PlCall("tell('tablets.pl'), listing(tablet/2), told."); 

Wie Sie diese Funktion sehen, es funktioniert für Behauptung wie erwartet, aber nicht für einzufahren. Die Sache ist, dass ich alle Tabletten Fakten (sie sind dynamisch) aus der Datei vor dem Einfügen der nächsten löschen möchten. PlQuery.PlCall("retractall(tablet/2)."); Diese Abfrage muss alle Datensätze löschen, die sich in der Datei befinden. und auch, wie man eine Tatsache zum Beispiel tablet(4,newatomic) löscht, aber keine anderen Fakten zu löschen.

Die resultierende Datei nach der Ausführung ist:

:- dynamic tablet/2. 

tablet(4, newatomic). 
tablet(1, n1ewatomic). 
tablet(2, n2ewatomic). 

Antwort

0

Nun, wollen nicht eine Frage löschen, weil es zwei upvotes bekam. Vielleicht wird es für jemanden nützlich sein.

Also war die Logik richtig.

Jedes Mal, wenn wir etwas Datenbank anhängen möchten wir schreiben:

assert(predicat(var1, var2, ... , varn)) 

Jedes Mal, wenn wir etwas aus der Datenbank löschen möchten wir schreiben:

retract(predicat(var1, var2, ... , varn)) 
retractall(predicat(var1, var2, ... , varn)) 

Wenn alle Bedingungen gleich sind es von db gelöscht ist (auch muss es dynamisch sein)

Wenn wir alle Daten löschen wollen, müssen wir es mit Variable angeben. So ...

retract(predicat(_,_,...,_)) 
retractall(predicat(_,_,...,_)) 

löscht alle Daten, die der Abfrage entsprechen. Und um Daten zu speichern, schreiben wir einfach als nächstes:

tell('database_file.txt'), %opening file for writing 
listing(ig_node), %writing 
told. %closing/saving file