[问题描述]

编程实现表达式合一算法,对任意两个表达式E1、E2,找出其最一般合一s

[测试数据]

输入表达式:

E1 = P (x,  f (x),  g (z) )       E2 = P (y,  f ( g (b) ),  y )

输出结果:

s = { g(b)/x ,  g(b)/y ,  b/z }

[实现提示]

1.用广义表结构存储表达式

例:

表达式E1 = P (x,  f (x),  g (z) ) ,可表示如下:

( P   x   ( f  x )   ( g  z) )

表达式E2 = P (y,  f ( g (b) ),  y ) ,可表示如下:

( P   y   ( f  ( g  b ) )   y )

2.用广义表结构存储合一(代换)

例:s = { g(b)/x ,  g(b)/y ,  b/z } ,可表示如下:

s = ( ( (g  b)  x)  ((g  b)  y)  (b  z) )

3.变量表示

置特性值 或 设变量表 或 与var构成序偶

假设使用变量表:

varlist = ( x  y  z  ……)

[测试用例] (unify  '(p  a  b)  '(p  x  y) )

[测试结果]

((A X) (B Y))

结果正确

代码:(以下是注释版本方便理解)

;;开始假设变量表:

(setq varlist '(x y z))

;;变量判断函数 isvar

;; 如果原子 a 是变量则返回真,否则返回假。

(defun isvar(a)

(if(member a varlist) t nil)

)

;;包含判断函数contain

;;判断e里面是否包含x

(defun contain(e x) ;; 或 (defun occur(y x)

(cond ( (null e) nil) ;;e为空,返回nil

( (atom e) (if(equal e x) t nil) ) ;;e为原子且e与x相同,返回t

;;e为原子且e与x不相同,返回nil

(t ;; 否则,当e不是空表也不是原子时

(cond

((contain (car e) x ) t);;递归,e的表头car中包含x,返回t

((contain (cdr e) x ) t) ;;递归,e的表尾cdr中包含x,返回t

(t nil)))));;都不包含,返回nil

;;card为表中第二个元素

;;替换算法subs ( e s1 ) ,其中 s1 是单个“变量代换对”,

;;采用递归处理,分别对表头、表尾进行代换,然后合并、返回。

(defun subs(e s1) ;; e为表达式,s1为单个代换

(let (new_head new_tail) ;;定义变量new_head和 new_tail

(cond ( (null e) nil);;e为空表,代换后结果为nil

( (atom e)(if (equal e (second s1)) (first s1) e ));;e为原子并且与s1的分母second相同 ,代换后结果为s1的分子first

;;否则,当e为原子并且与s1的分母不相同 代换后结果e

(t

(setq new_head (subs(car e) s1) )

(setq new_tail(subs(cdr e) s1) )

(cons new_head new_tail))) ) )

;;t 用 s1 对 e 的表头做代换得到新表头 new_head

;;用 s1 对 e 的表尾做代换得到新表尾 new_tail

;;用 cons 函数将 new_head 加到 new_tail 的前面

;;代换函数 substitution

;;利用迭代,进行替换

(defun substitution(m nlist)

(cond ((null nlist) m);;如果nlist为空表,返回m

(t (setq m (subs m (car nlist)));;如果不为空表,m值为nlist的表头替换到m的结果

(substitution m (cdr nlist)))));;迭代,将nlist的表尾替换到m

;;先写算法子函数cp1,将 s2 作用到 s1 的“分子”上

(defun cp1(s1 s2)

(let (ti vi new_ti);;定义三个变量ti vi new_ti

(cond ((null s1) '( ) );;如果s1为空,返回空表

(t (setq ti (caar s1)) ;; 如果s1不为空,取 s1 中表头代换的“分子”给ti,即表头的头

(setq vi (cdar s1)) ;; 取 s1 中表头代换的“分母”给vi,即表头的尾

(setq new_ti (substitution ti s2)) ;; 将 s2 作用到 ti 上得到的结果给new_ti

(cons (cons new_ti vi)( cp1 (cdr s1) s2) ))))) ;; 将新的表头代换加入新的表尾代换(表尾递归结果)合并

;;((合并new_ti与ti) , (递归调用cp1,对s1的尾部进行替换)),并返回结果

;;caar表头的头

;;cdar表头的尾

;;合成函数 compose ,先调用算法子函数cp1,然后让返回结果与s2取并集

(defun compose(s1 s2)

(let (new_s1) ;;定义new_s1

(setq new_s1 (cp1 s1 s2)) ;; 将 s2 作用到 s1 的“分子”上

(append new_s1 s2))) ;;将new_s1与s2合并,并返回结果

;;合一函数 unify

(defun unify(e1 e2)

(let

(bf f1 f2 t1 t2 s1 s2 g1 g2);;定义变量

(cond ((or (atom e1) (atom e2))

(when (not (atom e1)) (setq bf e1) (setq e1 e2) (setq e2 bf))

(cond

((equal e1 e2) '())

((and (isvar e1) (contain e2 e1)) 'fail)

((isvar e1) (list (list e2 e1)))

((isvar e2) (list (list e1 e2)))

(t 'fail)) )

(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)))))) ) )

以下是实际代码:(用lispwork运行时不要写注释,可直接运行)

(setq varlist '(x y z))

(defun isvar(a)

(if(member a varlist) t nil)

)

(defun contain(e m)

(cond ( (null e) nil)

( (atom e) (if(equal e m) t nil) )

(t

(cond

((contain (car e) m ) t)

((contain (cdr e) m ) t)

(t nil)

)

)

)

)

(defun sb(e s1)

(let (head tail)

(cond ((null e) nil)

((atom e)(if (equal e (second s1)) (first s1) e ))

(t

(setq head (sb (car e) s1) )

(setq tail (sb (cdr e) s1) )

(cons head tail)

)

)

)

)

(defun substitution(e m)

(cond ((null m) e)

(t

(setq e (sb e (car m)))

(substitution e (cdr m))

)

)

)

(defun cp1(s1 s2)

(let (ti vi new_ti)

(cond ((null s1) '() )

(t

(setq ti (caar s1))

(setq vi (cdar s1))

(setq new_ti (substitution ti s2 ))

(cons (cons new_ti vi) (cp1 (cdr s1) s2)

)

)

)

)

)

(defun compose(s1 s2)

(let (new_s1)

(setq new_s1 (cp1 s1 s2))

(append new_s1 s2)

)

)

(defun unify(e1 e2)

(let (bf f1 f2 t1 t2 s1 s2 g1 g2)

(cond ( (or (atom e1) (atom e2))

(when (not (atom e1)) (setq bf e1) (setq e1 e2) (setq e2 bf))

(cond

((equal e1 e2) '())

((and (isvar e1) (contain e2 e1)) 'fail)

((isvar e1) (list (list e2 e1)))

((isvar e2) (list (list e1 e2)))

(t 'fail)

)

)

(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))

)

)

)

)

)

)

人工智能合一算法java语言实现_人工智能AI---用LISP语言写合一算法unify相关推荐

  1. 人工智能python零基础入门教程_人工智能零基础入门视频教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 人工智能零基础入门视频教程 100天人工智能工程师学习计划 -- 全程实战案例,从机器学习原理到推荐系统实现,从深度学习入门到图像语义分割及写诗机器人,再 ...

  2. 人工智能方面有什么创业项目_人工智能创业项目方案(未来人工智能最挣钱的方向)...

    教育领域的人工智能 俞敏洪接受记者采访时曾说:"人工智能的发展,在教育上的应用比用在世界上任何一个领域都更加有效--凡是用人工智能,包括大数据.区块链等技术,在学生学习进程中,做一些不可修改 ...

  3. 人工智能芯片龙头之一gti概念股_人工智能概念股有哪些 人工智能芯片谁是龙头?...

    人工智能,英文缩写为AI.它是研究.开发用于模拟.延伸和扩展人的智能的理论.方法.技术及应用系统的一门新的技术科学.那么,人工智能概念股有哪些呢?我们来简单的了解一下吧. 人工智能概念股有哪些? 从近 ...

  4. lisp不是函授型语言_讨论:为什么Lisp语言不再被广泛使用

    [IT168 评论]很久以前,这种语言站在计算机科学研究的前沿,特别是人工智能的研究方面.现在,它很少被用到,这一切并不是因为古老,类似古老的语言却被广泛应用. 其他类似的古老的语言有 FORTRAN ...

  5. python快速排序算法没看懂_你需要知道的九大排序算法【Python实现】之快速排序...

    五.快速排序 基本思想:  通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序. 算法实现: ​ #coding: ...

  6. C语言贪吃蛇最短路径,AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  7. 换发型算法_【AI超级美发师】深度学习算法打造染发特效(附代码)

    原标题:[AI超级美发师]深度学习算法打造染发特效(附代码) 来源:OpenCV学堂 作者:胡耀武 [新智元导读]如今,在类似天天P图.美图秀秀等手机APP中,给指定照片或视频中的人物更换头发颜色已经 ...

  8. php语言学习_新手如何学习PHP语言

    新手如何学习PHP语言 php语言是一种通用开源脚本语言,那么作为新手,你知道该如何学习php语言吗,下面我们一起来看看吧. 新手如何学习PHP语言 1.Php的用途是什么? 对于一个php门外汉来说 ...

  9. 人工智能合一算法java语言实现_人工智能合一算法UNify.doc

    -算法实现 一.作业目的: 用某一种编程语言实现合一算法. 二.首先把教材中的Unify算法表述如下: 算法 unify (E1, E2) 1 .if E1或E2是一个原子(即一个谓词符号.函数符号. ...

最新文章

  1. Spring是如何校验XML的
  2. Tomcat虚拟目录的配置
  3. mysql服务不能启动的几大原因
  4. SQL Search
  5. c语言实现配置文件的读写
  6. 重学java基础第二十五课:数据类型
  7. CSDN 统一标签设计 征求反馈
  8. oracle+行换列,Oracle的数据表中行转列与列转行的操作实例讲解
  9. 如何用php查不同,php-MySql调查不同查询
  10. iphone xcode for lion 下载地址
  11. php composer 框架,用 Composer 组建了个 PHP 框架
  12. php跟python效率_python为何效率慢点?PHP跟Python的解释器都是C写的,PHP为什么能快点?...
  13. matlab 2017a安装教程
  14. 光纤接口类型及光纤收发器指示灯图解
  15. 网易云音乐API-本地node开启
  16. 【HAVENT原创】让 axios 支持 jsonp
  17. Oracle最新技术网站
  18. python实现抽签功能(不放回抽样)
  19. 异步编程之美——CompletableFuture
  20. PDF文件破解打开密码

热门文章

  1. 硬件笔记(1)---- 以太网控制器类型
  2. 终于找到了Visual Studio.net 2003完整高速下载
  3. ADAS-透视前方:汽车HUD技术原理解析
  4. ELKStack入门篇(一)之ELK部署和使用
  5. 3D视觉焊接机器人大量投入使用!焊工的未来何在?
  6. [Android Training视频系列] 8.3 Dealing with Audio Output Hardware
  7. 专车,你动了谁的奶酪?
  8. 干活分享 | MAX485 系列 RS-422/RS-485 接口 IC5RS-485/RS-422 Transceivers MAX485
  9. 基于JSP的珠宝商城的设计与实现
  10. ArcGIS开发笔记——解除mdb锁定并自动清除ldb