Zadanie 2
Zaimplementuj interpreter jezyka Prolog dla formul logiki
zdan. Elementy jezyka sa zdefiniowane przez nastepujace typy:
type proposition = string
type atom = proposition
type goal = atom list
type clause = proposition * goal
type database = clause list
type program = database * goal
Interpreter powinien uzywac dwoch kotynuacji: sukcesu i porazki, w celu
zaimplementowania przeszukiwania drzewa rezolucji z nawrotami, ktore
pojawia sie w przypadku napotkania porazki albo na zyczenie
uzytkownika. Po uzgodnieniu zadanego celu, interpreter powinien
wypisac na ekran liczbe unifikacji, ktore do tego uzgodnienia
doprowadzily, a nastepnie zapytac uzytkownika czy szukac dalej. Jesli
nie, to przeszukiwanie zostaje zakonczone nawet jesli sa jakies
niesprawdzone jeszcze punkty nawrotu. W przeciwnym razie nalezy
wykorzystac kontynuacje porazki do wznowienia poszukiwan.
Unifikacja w naszym jezyku sprowadza sie do sprawdzenia identycznosci
zmiennych zdaniowych.
Proponowana struktura interpretera:
eval_atom - funkcja odpowiedzialna za interpretacje formul atomowych
(zmiennych zdaniowych)
eval_goal - funkcja odpowiedzialna za interpretacje celow
eval_prog - funkcja glowna, odpowiedzialna za rozpoczecie
przeszukiwania przez wywolanie eval_goal z odpowiednio zainicjowanymi
kontynuacjami sukcesu i porazki.
Mozliwe dalsze kroki:
-
defunkcjonalizacja kontynuacji prowadzaca do maszyny abstrakcyjnej
dla uproszczonego Prologa
- eliminacja kontynuacji porazki prowadzaca do programu w CCS, a
nastepnie eliminacja kontynuacji sukcesu prowadzaca do programu w DS,
uzywajacego operatorow shift i reset
- wzbogacenie jezyka i interpretera o operator ciecia.
|