home *** CD-ROM | disk | FTP | other *** search
- ; Simple Prolog Interpreter in LittleLisp - based
- ; on pil from xlisp
-
- (define (prolog database)
- (let ((goal (begin (print '?-) (read))))
- (prove (list (rename goal '(0)))
- '((bottom-of environment))
- database
- 1))
- (prolog database))
-
- (define (prove goals env db level)
- (cond ((null? goals)
- (pbind env env)
- (not (y-or-n-p "More?")))
- (t (try db db
- (cdr goals) (car goals)
- env level))))
-
- (define (try dbl db gl goal env l)
- (let ((ass nil) (new nil))
- (cond ((null? dbl) ())
- (t (set! ass (rename (car dbl) (list l)))
- (set! new (unify goal (car ass) env))
- (try1 new dbl db gl goal env l ass)))))
-
- (define (try1 new b db gl goal env l ass)
- (let ((d nil))
- (cond ((null? new)
- (try (cdr b) db gl goal env l))
- ((set! d (prove (append (cdr ass) gl) new db (+ 1 l))) d)
- (t (try (cdr b) db gl goal env l)))))
-
- (define (unify x y env)
- (unify1 (value x env) (value y env) env))
-
- (define (unify1 x y env)
- (cond ((var? x) (cons (list x y) env))
- ((var? y) (cons (list y x) env))
- ((or (atom? x) (atom? y))
- (cond ((eq? x y) env)
- (t nil)))
- (else (list-unify x y env))))
-
- (define (list-unify x y env)
- (let ((new (unify (car x) (car y) env)))
- (cond (new (unify (cdr x) (cdr y) new))
- (else nil))))
-
- (define (value x env)
- (let ((binding nil))
- (cond ((var? x)
- (set! binding (assoc x env))
- (cond ((null? binding) x)
- (t (value (nth 2 binding) env))))
- (t x))))
-
- (define (expand x env)
- (let ((binding nil))
- (cond ((var? x) (set! binding (assoc x env))
- (if (null? binding) x (expand (cadr binding) env)))
- ((atom? x) x)
- (else (cons (expand (car x) env)
- (expand (cdr x) env))))))
-
- (define (var? x)
- (and x (pair? x) (eq? (car x) '?)))
-
- (define (rename term list-of-level)
- (cond ((var? term) (append term list-of-level))
- ((atom? term) term)
- (t (cons (rename (car term) list-of-level)
- (rename (cdr term) list-of-level)))))
-
- (define (pbind env-left env)
- (cond ((cdr env-left)
- (cond ((= 0 (nth 3 (caar env-left)))
- (print
- (nth 2 (caar env-left)))
- (print '=)
- (print (expand (caar env-left) env))
- (newline)))
- (pbind (cdr env-left) env))))
-
- (define db-1 '(((father jack ken))
- ((father jack karen))
- ((grandparent (? gp) (? gc))
- (parent (? gp) (? p))
- (parent (? p) (? gc)))
- ((mother el ken))
- ((mother cele jack))))
- (define db-2 '(((parent (? p) (? c))
- (mother (? p) (? c)))
- ((parent (? p) (? c))
- (father (? p) (? c)))))
- (define db (append db-1 db-2))
-
- (define db1 '(((app () (? x) (? x)))
- ((app ((? h) . (? t)) (? l) ((? h) . (? r)))
- (app (? t) (? l) (? r)))))
-
- (define (y-or-n-p prompt)
- (print prompt)
- (eq? (read) 'y))
-
- (define (nth n l)
- (cond ((= 1 n) (car l))
- ((= 2 n) (cadr l))
- ((= 3 n) (car (cddr l)))
- (else nil)))