(defun pr (x) (print x)) (defun pr1 (x) (prin1 x)) ;(setq db (list "")) ;(setq db '()) (defun fd1 () (setq rb '()) (loadrules) (setq db '()) (filldb) (setq L rb) (interprit) (pr1 "[final result:]") (pr1 (last db) )) #| to forward1 m "rb [] loadrules pr [enter facts into data base] m "db [] filldb interpret :rb (pr [final result:] last :db) end |# (defun filldb () (pr1 "next fact:") (setq n (read-line)) (cond ((string= n "*") nil) ((string= n "") (filldb)) ;(t (progn (setq db (cons db (list n)))(filldb))) )) (t (progn (setq db (append db (list n)))(filldb))) )) (setq rb '()) (defun loadrules () (pr1 "[enter next rule]") (pr1 "condition") (setq c (read-line)) (cond ((string= c "*") (progn (setq rb (nreverse rb)) nil)) (t (progn (pr1 "action") (setq a (read-line)) (setq rb (cons (list c a) rb)) (loadrules)))) ) (defun member$ (item lst) (if (null lst) nil (if (equal (car lst) item) lst (member$ item (cdr lst)) ))) (defun fire () (setq db (append db (last L1))) (pr1 "[deduced:]") (pr1 (last L1))) (defun check (x L) (if (null L) nil (if (string= x (car L)) t (check x (cdr L))))) (setq L '(("b" "c")("a" "b"))) (setq L '(("a" "b"))) (setq L '(("a" "b") ("b" "c"))) (setq rb '(("a" "b") ("b" "c"))) (setq db '("a")) (defun interprit () (if (null L) nil (progn (setq L1 (car L)) (setq c (car L1)) )) (if (and (check c db) (not (member$ (car (last L1)) db)) ) (progn (fire)(interprit)) (progn (setq L (cdr L)) (pr1 "2")(pr1 L)) ) (if (null L) nil (interprit)) )