% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % % En definerende fortolker for en meget lille % delmaengde af LISP % % Kapitel 7 i "Sprog og abstrakte maskiner" % % (c) 2000, Henning Christiansen % %% lisp( , ) :- dynamic lisp/2. lisp( [quote, X], X). lisp( [plus, X, Y], Vaerdi):- lisp(X, Xvaerdi), lisp(Y, Yvaerdi), Vaerdi is Xvaerdi + Yvaerdi. lisp( [minus, X, Y], Vaerdi):- lisp(X, Xvaerdi), lisp(Y, Yvaerdi), Vaerdi is Xvaerdi - Yvaerdi. lisp( [times, X, Y], Vaerdi):- lisp(X, Xvaerdi), lisp(Y, Yvaerdi), Vaerdi is Xvaerdi * Yvaerdi. lisp( Tal, Tal):- integer(Tal). lisp([], []). lisp(t, t). lisp( [equal, X, Y], Vaerdi):- lisp(X, Xvaerdi), lisp(Y, Yvaerdi), (Xvaerdi = Yvaerdi, !, Vaerdi = t; Vaerdi = []). lisp( [car, X], Vaerdi):- lisp(X, Xvaerdi), (Xvaerdi = [Vaerdi | _], ! ; nl, write('Cdr of non-list: '), write(Xvaerdi), abort). lisp( [cdr, X], Vaerdi):- lisp(X, Xvaerdi), (Xvaerdi = [_ | Vaerdi], ! ; nl, write('Cdr of non-list: '), write(Xvaerdi), abort). lisp( [cons, X, Y], Vaerdi):- lisp(X, Xvaerdi), lisp(Y, Yvaerdi), Vaerdi = [Xvaerdi | Yvaerdi]. % Obs, to regler for progn: lisp( [progn, X], Xvaerdi):- !, lisp(X, Xvaerdi). lisp( [progn, X | MereX], Vaerdi):- lisp(X, _), lisp( [progn | MereX], Vaerdi). lisp( [setq, V, X], Xvaerdi):- lisp(X, Xvaerdi), asserta( ( lisp( V, Xvaerdi):- ! ) ). lisp( [if, B, X, Y], Vaerdi):- lisp(B, Bvaerdi), ( Bvaerdi = [], !, lisp(Y, Vaerdi) ; lisp(X, Vaerdi) ). lisp( [defun, F, Param, Krop], F):- asserta( ( lisp( [F, Arg], Vaerdi):- !, lisp( [setq, Param, Arg], ArgV), lisp( Krop, Vaerdi), retract( (lisp(Param, ArgV):- !) ) ) ). /* Eksempler: lisp([defun, kvadrat, n, [times,n,n]], K). lisp( [defun, fak, n, [if, [equal, n, 0], 1, [times,n,[fak,[minus,n,1]]]]], F). */