2015-05-25 9 views
5

Właśnie nawiązałem połączenie z SWI Prolog i chcę manipulować faktami. na przykład wycofać i potwierdzić je.Prolog C# Interfejs chowa się z pliku

mam jakąś funkcję tak:

 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."); 

Jak widać z tej funkcji, to działa na twierdzeniu, zgodnie z oczekiwaniami, ale nie chowa się. Chodzi o to, że chcę usunąć wszystkie fakty (są dynamiczne) z pliku przed wstawieniem kolejnych. PlQuery.PlCall("retractall(tablet/2)."); to zapytanie musi usunąć cały rekord, który znajduje się w pliku. a także jak usunąć fakt, na przykład tablet(4,newatomic), ale nie usuwać kolejnych faktów.

Powstały plik po wykonaniu brzmi:

:- dynamic tablet/2. 

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

Odpowiedz

0

Cóż, nie chce usunąć pytanie, bo to ma dwie upvotes. Być może będzie to przydatne dla kogoś.

Tak, logika była słuszna.

Gdy chcemy podłączyć coś do bazy danych piszemy:

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

Gdy chcemy coś usunąć z bazy danych piszemy:

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

Jeżeli wszystkie warunki są równe to usunięty z db (również musi być dynamiczny)

Jeśli chcemy usunąć wszystkie dane, musimy określić je za pomocą zmiennej. Więc ...

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

usunie wszystkie dane pasujące do zapytania. Aby zapisać dane, piszemy dalej:

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