Нет описания

evalo.scm 1.2KB

    (load "/home/lu/t/miniKanren/mk.scm") ; a simple lambda calculus in miniKanren ; x - variables ; (lambda (x) x) - abstraction ; (e1 e2) - application (define lookupo (lambda (x env val) (fresh (y v rest) (== `((,y . ,v) . ,rest) env) (conde [(== x y) (== v val)] [(=/= x y) (lookupo x rest val)])))) (define evalmanyo (lambda (l env r) (conde [(== l '()) (== l r)] [(fresh (h t h^ t^) (== l `(,h . ,t)) (== r `(,h^ . ,t^)) (evalo h env h^) (evalmanyo t env t^))]))) (define evalo (lambda (expr env val) (conde [(symbolo expr) (lookupo expr env val)] [(fresh (e) (== `(quote ,e) expr) (== e val))] [(fresh (els) (== `(list . ,els) expr) (evalmanyo els env val))] [(fresh (x body) (== `(lambda (,x) ,body) expr) (== `(,expr in ,env) val))] [(fresh (e1 e2 x body env^ arg) (== `(,e1 ,e2) expr) (evalo e1 env `((lambda (,x) ,body) in ,env^)) (evalo e2 env arg) (evalo body `((,x . ,arg) . ,env^) val))]))) (define quineo (lambda (q) (evalo q '() q))) (define twineo (lambda (p q) (=/= p q) (evalo p '() q) (evalo q '() p)))