坚决鄙视一介绍Prolog就用家谱树做例子的帖子/教材/指南。跟我八辈子不搭界的某银的家谱关我P事啊?就算自己的家谱。我爷爷的姑姑的侄儿的表姐的大舅子关我P事啊?
和朋友聊到用Prolog实现
上次借助amb解决的谜题。Prolog内置了搜索和裁剪。写出的代码近乎琐碎,根本不需要amb。想想看,用amb时,那些描述约束的语句(调用must()函数的那几行)在选择语句
之后执行,但竟然能左右之前被执行的语句的执行结果。而所有的细节都被封装在一个平淡的callcc里面。程序员可以专注于描述问题,而不用考虑代码执行的细节(在某种程度上),甚至不用考虑代码执行的顺序,这是何等强大的抽象和表达能力。而Prolog把这种抽象能力在语言级别实现,更进一步。只不过上次用和伪代码无异的Ruby代码都让很多老大望而却步,用句法和语义与流行编程语言迥异的Prolog不是更费力不讨好?再说代码本身也不出奇,不能给已经知道Prolog的老大们带来快感,用作简介恐怕又不够周详。不过既然写出来了,就忍不住手痒想贴出来。典型的egoblogging。先鄙视一下自己。
Prolog也是门“古老”的语言。Prolog是PROgramming in LOgic的缩写。它不是最早的逻辑编程语言(最早的逻辑编程语言1964年左右就做出来了),不过大概是最有名的。1971年, 29岁的法国人Alain Colmerauer在加拿大出名的花花城市蒙特利尔亲切会见了刚拿到教职的比利时人Robert Pasero和Phlippe Roussel。Alain是个法国愤青,热衷于搞一个当时看来颇为激进的研究项目:探索用自然语言进行逻辑推理。而选择的自然语言便是是——还用猜么——自然是法语。法国银就好这一口。为了推进项目,他们决定实现一套系统,帮助他们理解自动定理证明和自然语言处理,于是花了大量精力研究怎么编写自动定理证明机和自然语言处理程序。结果无心插柳,1972年,Prolog的雏形问世。同年,一个叫Dennis Ritche的大胡子推出了一门叫C的语言。一个叫Alan Kay的小胡子也推出一门叫Smalltalk-72的语言。三年后,MIT两个没留胡子的巫师推出了一门叫Scheme的语言。后面的东西已是历史。不鸟C语言的计算机科学家们郁闷地看着C席卷世界每一个角落。不鸟其他一切语言的Smalltalker们郁闷地看着Java借Smalltalk的东风也席卷世界每一个角落。声明式编程(declarative programming)的铁杆拥趸们把玩着他们心爱的Prolog,坚信有一天人们会幡然领悟:声明式编程才是王道。而LISPer们依然喜欢对每一项热点技术做出同样的评论:这个东东Lisp里早已有了。
已经很久没写Prolog。幸好这坨程序比Ruby版的程序还直观。只是绝大部分库函数都忘了,就实现了几个阳春版的。从下面的代码可见,代码比用amb()的还简单。直接把题目的条件描述一下,系统自动找出合适的答案。想自己动手的老大们,可以先跳到这里安装SWI-Prolog。安装好了后,在安装目录下有个bin目录。目录下的plcon.exe进入控制台程序。而plwin.exe启动一个简单的IDE:
方便起见,再贴一下题目:Baker, Cooper, Fletcher, Miller, 和Smith住在一动5层公寓的不同楼层。Baker不在顶楼住。Cooper不在底楼住。Fletcher既不在顶楼也不在底楼。Miller住的楼层比Cooper住的高。Smith和Fletcher的楼层不相邻。Fletcher和Cooper的楼层不相邻。问每个人住的楼层。
最后的代码如下:
[X|Xs]表示一个表。X是第一个元素,而Xs是子表。比如说,如果[X|Xs]=[1, 2, 3, 4, 5],那X就等于1, 而Xs等于[2, 3, 4, 5]。下划线,_, 是一个特殊变量,表示“无所谓”。比如说[_|Xs]表示一个表的第一个元素可以是任何值。[X|_]表示一个表的子表可以是任何值。操作符=\=相当于流行编程语言里的!=。逗号表示逻辑的and, 相当与类C语言里的&&。句号表示一行语句结束。任意两行的关系是逻辑的或,相当于类C语言里的 ||。比如说开头两行表示一个member这个函数要为真的话,要么满足第一行的条件,要么满足第二行的条件。
Prolog的基本思路是模式匹配,基本数据结构是表。每一个函数其实是一个谓词判断。以头两行实现的函数member为例:member接受两个参数。第一个参数一个变量,第二个参数是一个表。当第一个参数是表里的元素时,member返回true(prolog里用yes),否则返回false(prolog里用no)。第一种情况member(X, [X|_])的意思是,如果一个元素X和表里的第一个元素一样,调用该函数就一定得到真值。注意,我们在这里并不关心X的具体值,只要X和表里第一个元素匹配,我们就知道X是表的元素了。正因为如此,我们也不关心子表的值,所以用一个特殊的变量,_, 来表示子表可以是任何东东。下一种情况也就了然:如果X和表里第一个元素不一样,那么我们递归地考察X是不是在子表里:member(X, Ys)。
关于模式匹配。实际执行一下就可以看出来了。比如说我们执行member(X, [1, 2, 3]):
- 先加载写好的amb.pl文件。因为每一个调用都是执行谓词断言,所以我们可以看到成功执行后,一定会得到一个安慰人心的yes。
- 执行member(X, [1, 2, 3]): 显然X等于1时,第一行语句,member(X, [X|_])被匹配。所以X可以为1。
- 如果不满足,输入分号,表示继续搜索(如果我们只想找一个答案,也可以直接敲入回车):
- 继续输入分号,
- 如果再输入分号,Prolog找无可找,就会返回no, 表示没有更多的匹配了:
- 如果是单纯的判断,Prolog直接输出结果:
- 如果我们打开调试开关,就更能看出匹配的原理了。系统每次自动搜索匹配的值,并内建变量跟踪搜索的结果。
最后一个函数根本就是对题目一对一的翻译。不能再简单了吧?都不知道有什么可以再解释的。
分享到:
相关推荐
Prolog,全称为“逻辑编程语言”(Programming in Logic),是一种声明式的编程语言,它以逻辑公式的形式来表达数据和程序。在这个压缩包文件中,我们可能会找到几个关键的Prolog实例程序,这些实例通常用于展示...
是人工智能的一个习题,要求是编写一个描述亲属关系的PROLOG程序。做的时候发现,网站上很少有关于人工智能的这个PROLOG程序,拿出来分享一下。
《专家系统PROLOG程序设计》是一本深入探讨如何利用PROLOG语言构建专家系统的教程。PROLOG,全称为“Programming in Logic”,是一种基于逻辑编程的计算机语言,尤其适合于处理复杂推理和知识表示的问题,因此在人工...
根据给定的信息,本文将详细解释如何通过Prolog语言创建一个描述亲属关系的程序,并基于已有的事实数据构建一个小型的演绎数据库。 ### 一、Prolog简介 Prolog是一种逻辑编程语言,它主要应用于人工智能领域,特别...
通过编写小规模的Prolog程序,例如创建简单的推理系统或解决特定的逻辑问题,可以更好地理解和掌握这种语言的精髓。 **6. 进阶主题** 随着对Prolog的深入学习,可以探索一些进阶主题,如DCG(Definite Clause ...
- **RubikCubeSolver**:一个图形界面的小程序,同样在逻辑服务器演示程序下运行。 - **国际象棋 V0.1**:使用 Visualprolog 编写的国际象棋程序,目前仍处于测试阶段。 #### 五、获取 Prolog 的途径 - **...
在本文中,我们将深入探讨微PROLOG的基本概念、语法结构、主要特性以及如何进行程序设计。** ### 1. 微PROLOG简介 微PROLOG起源于70年代末,是为了便于理解和教学而设计的。它保留了PROLOG的核心概念,如规则、事实...
Prolog,全称“逻辑程序设计语言”(Programming in Logic),是一种基于逻辑推理的编程语言,广泛应用于人工智能、自然语言处理、专家系统等领域。在本实验中,我们将深入探讨如何使用Prolog来解决实际问题,特别是...
选修课实验报告:1、编写一个描述亲属关系的PROLOG程序,然后再给予出一些事实数据,建立一个小型演绎数据库。2、编写一个路径查询程序,使其能输出图中所有路径。3、一个雇主在发出招聘广告之后,收到了大量的应聘...
**人工智能程序设计**是...总之,LISP和Prolog作为AI程序设计的基础,为理解和实现人工智能提供了重要的工具和方法。通过深入学习和实践这两种语言,开发者能够更好地理解和构建智能系统,推动人工智能技术的发展。
两个瓶子,一个四加仑一个3加仑,输入您想要的最终状态,可以智能的搜索出倒法,需要配合A*搜索的prolog程序
Turbo Prolog是一款经典的教学与研究型Prolog编程环境,它为学习和开发Prolog程序提供了便利。Prolog,全称“逻辑编程”(Programming in Logic),是一种基于逻辑推理的编程语言,广泛应用于人工智能、自然语言处理...
然而,文档也包含一小部分关于Prolog逻辑基础的内容,旨在为读者提供Prolog编程的逻辑背景知识。 文档还提到,所有示例均使用SWI-Prolog(***)进行测试,并且预计同样适用于大多数其他Prolog系统。SWI-Prolog是...
【描述】提到的"Turbo Prolog"是一款早期的Prolog开发环境,由Borland公司推出,它提供了一个友好的用户界面,便于开发者编写和调试Prolog程序。"源代码是图片形式"表明,这个医疗诊断系统的程序代码可能是以图像的...
- **Visual Prolog 开发环境**:这是开发 Visual Prolog 应用程序的核心工具。 - **必要的运行时库**:确保应用程序可以在目标系统上运行。 **1.2 启动 Visual Prolog 开发环境** 启动 Visual Prolog 开发环境非常...
标题中的“识别动物专家系统(用prolog编程)”指的是使用Prolog编程语言构建的一个智能程序,该程序设计用于帮助用户识别不同的动物。专家系统是一种人工智能应用,它模仿人类专家的知识和推理过程来解决复杂的问题...
### Prolog语言解决8皇后问题源程序解析 #### 一、引言 8皇后问题是棋盘上的一种经典问题,目标是在一个8×8的棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击(即不在同一行、同一列以及同一对角线上)。这个...
本书主要介绍了 Visual Prolog 的可视化编程接口(VPI),通过这一接口,开发者可以轻松地创建复杂的 GUI 应用程序。 #### 二、Visual Prolog VPI 层次结构 ##### 2.1 引言 VPI 提供了一系列的工具和函数,用于...
它将传统的Prolog语法与面向对象的编程概念相结合,为开发者提供了一个直观易用的图形界面,使得Prolog程序的编写、调试和管理变得更加简单。本压缩包"cgi.rar_prolog_visual prolog_visual prolog 7.1"包含了关于...