Zadania na 19.12.2007
Zadanie 1
Co robi ponizsza funkcja?
fun foo xs
    = let fun bar nil k
	      = k nil
	    | bar (x::xs) k
	      = bar xs (fn vs => x::(k vs))
      in bar xs (fn vs => vs)
      end
  1. Przetransformuj powyzsza funkcje do 2CPS.
  2. Zdefunkcjonalizuj kontynuacje i meta-kontynuacje w otrzymanej funkcji.
  3. Przetransformuj funkcje wyjsciowa do DS, uzywajac operatorow shift i reset w razie potrzeby.
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.