2016-06-08 38 views
4

Kann Prolog berechnete Ziele memotisieren?Memo-Ziele in Prolog

Damit meine ich, dass Prolog Ziele, die vorher berechnet wurden, nicht neu berechnen sollte.

So zum Beispiel die gleichen Berechnungen für mich sind:

goal([first, one], he, she, var(cat, 5)). 
goal([first, one], he, she, var(cat, 5)). 

aber nicht

goal([first, one], he, she, var(cat, 6)). 

So in der Tat muss es möglich sein, dass die Ziele zu vereinen.

Antwort

2

Viele Prolog Systeme bieten die Möglichkeit implizit solche Ergebnisse zu erfassen. Dies wird Tabling genannt; Informationen zur Aktivierung finden Sie in der Dokumentation Ihres Prolog-Systems.

Eine nette Sache über Prolog ist, dass Sie leicht eine etwas einfachere (und viel weniger leistungsfähige) Variante des Einlegens selbst erstellen können, indem Sie beispielsweise assertz/1 verwenden, um berechnete Ergebnisse zu speichern und zu laden.

Eine sehr einfältig Implementierung könnte ähnlich aussehen wie:

 
:- dynamic memo_/1. 

memo(Goal) :- 
    ( memo_(Goal) -> true 
    ; Goal, 
     assertz(memo_(Goal)) 
    ). 

Caveat emptor ...

Das ist natürlich nicht das, was vollwertiges Einreichungs dir geben.

+0

Das Problem erscheint, weil ich Ziel mit rekursivem subgoal berechnen muss. Und jedes Unterziel hat eine Liste und hängt davon ab, ob das fehlschlägt oder nicht. Diese Liste sollte in diesem Sinne global sein, dass, wenn ein Unterziel dort etwas anhängt, das andere Teilziel es sieht. Aber das Problem ist mit Backtracking-es alles rückgängig machen. Wie man damit umgeht? – Gilgamesz

+0

Wie immer: Sie geben die Listen weiter, die Sie als Argumente ** für alle Prädikate benötigen, die sie benötigen. Und ja, Backtracking macht alle Bindungen rückgängig, was irgendwie der Fall ist. – mat

+0

Ok, aber was ist mit der Situation, wenn ich eine Liste durch Backtracking behalten möchte. Ich weiß, dass das Backtracking die Basis/der Schlüsselpunkt in Prolog ist, aber wie kann man mit solchen Situationen umgehen? – Gilgamesz