人工智能--合一算法

人工智能合一算法

编写语言:

lisp

运行结果

人工智能--合一算法_第1张图片
人工智能--合一算法_第2张图片

带注释的源代码

;; 设置变量表用以判断变量
(setq varlist '(x y z))


;; 合一函数
;; 用例 (unify '(p a b)  '(p x y))
(defun unify(e1 e2) 
  (let (bf f1 f2 t1 t2 s1 s2 g1 g2)
    (cond 
      ;; 当e1或e2为原子或空表时
      ((or (atom e1) (atom e2))
       (when (not (atom e1)) (setq bf e1) (setq e1 e2) (setq e2 bf))
       (cond
         ((equal e1 e2) nil)
         ((and (isvar e1) (contain e2 e1)) 'fail)
         ((isvar e1) (list (list e2 e1)))
         ((isvar e2) (list (list e1 e2)))
         (t 'fail)) )
      ;; 当e1与e2都为列表时
      (t
        (setq f1 (car e1)) (setq t1 (cdr e1))
        (setq f2 (first e2)) (setq t2 (rest e2))
        (setq s1 (unify f1 f2))
        (cond ((equal s1 'fail)  'fail)
              (t 
                (setq g1 (substitution t1 s1))
                (setq g2 (substitution t2 s1))
                (setq s2 (unify g1 g2))
                (if (equal s2 'fail) 'fail (compose s1 s2))))))))


;; 合成函数
;; 用例 (compose '((z x) (a y)) '((b z)))
(defun compose(a b)
  (append (substitution a b) b))


;; 代换函数
;; 代换函数中调用了sub子函数
;; 用例 (substitution '(p x y) '((a x) (b y)))
(defun substitution(e s)
  (loop for item in s do(setq e (sub item e)))
  (return-from substitution e))

(defun sub(s e)
  (let (he ta)
    (setq he (car e))
    (setq ta (cdr e))
    ;; 当e为空表时,递归返回
    (if (null e) (return-from sub nil))
    ;; 否则当e的首元素为原子时
    (if (atom he) 
      ;; 当首元素与要替换的变量相,等时进行替换
      (if (equal he (second s)) (cons (first s) (sub s ta)) (cons he (sub s ta)))
      (cons (sub s he) (sub s ta)))))


;; 包含判断函数
;; 用例 (contain '(f x (g y)) 'y )
(defun contain (e x)
  ;; 当e为原子时
  (when (atom e) (return-from contain t))
  ;; 否则进行递归判断
  (loop for item in e
        if(atom item) do(if (equal item x) (return-from contain t))
        else do(if (contain item x) (return-from contain t)))
  (return-from contain nil))


;; 判断变量函数
;; 用例 (isvar 'x)
(defun isvar(a) 
  ;; 利用变量表来预定义变量
  (if (member a varlist) t nil))

  1. 变量是预定义的, 放在了程序开始处的变量表中. 该程序中认定x,y,z是变量, 其他的字母组成的串作为常量, 并且lisp语言中只存在大写的串, 因为小写的串也会被lisp语言转换成大写的.
  2. 程序中用defun定义的函数都可以放在lisp顶层运行, 共有unify, compose , substitution, sub, isvar五个函数

你可能感兴趣的:(人工智能,lisp)