Prolog奇怪奇妙的思考方式
今天在《七周七语言》中接触到了prolog,发现它的编程模式和思考方式的确比较奇怪,但同时也非常奇妙,值得学习一下。
1. prolog语言介绍
和SQL一样,Prolog基于数据库,但是其数据由逻辑规则和关系组成;和SQL一样,Prolog包含两个部分:一部分用于描述数据,而另一部分则用于查询数据。在Prolog中,数据以逻辑规则的形式存在,下面是基本构建单元。
事实:事实是关于真实世界的基本断言。(Babe是一头猪,猪喜欢泥巴。)
规则:规则是关于真实世界中一些事实的推论。(如果一个动物是猪,那么它喜欢泥巴。)
查询:查询是关于真实世界的一个问题。(Babe喜欢泥巴吗?)
事实和规则被放入一个知识库(knowledge base)。Prolog编译器将这个知识库编译成一种适于高效查询的形式。
2. 语言编译器gprolog
本文使用的编译器为:gprolog,下载地址 ftp://gprolog.univ-paris1.fr/pub/gprolog/gprolog-1.4.4.tar.gz,
使用开源软件 configure && make && make install即可
3. 谁是谁的爸爸?
样例来源:http://fengdidi.github.io/blog/2011/11/16/di-2zhang-shui-shi-shui-de-ba-ba/
推荐阅读:http://fengdidi.github.io/blog/archives/
假设我们有这样一个家谱图:
我们现在的任务是将这个家谱图写成程序代码的形式。请打开你最喜欢的文本编辑器,输入以下代码。
father.pl:
male(di). male(jianbo). female(xin). female(yuan). female(yuqing). father(jianbo,di). father(di,yuqing). mother(xin,di). mother(yuan,yuqing). grandfather(X,Y):-father(X,Z),father(Z,Y). grandmother(X,Y):-mother(X,Z),father(Z,Y). daughter(X,Y):-father(X,Y),female(Y).
这段代码里面的每一行都代表一个子句(clause)。
其中带有“:-”的子句叫做规则(rule),
不带有”:-“的子句叫做事实(fact)。
另外,在Prolog里面诸如”di”和”jianbo”这类以小写英文字母开头的名称我们称它们为原子(atom),以大写英文字母为开头的名称我们称它们为变量,例如上面程序里面的”X”和”Y”。顾名思义,原子是常量,即它的值是不可变的,而变量的值可以改变。最后需要讲的是,在Prolog里面”,”代表逻辑关系中的”且”,我们回在后面的章节里面看到,”;”代表逻辑关系里面的”或”。
4. 运行测试
粗体斜体表示输入。
#gprolog
gprolog GNU Prolog 1.4.4 (64 bits)
Compiled Oct 11 2013, 09:26:50 with gcc By Daniel Diaz Copyright (C) 1999-2013 Daniel Diaz
| ?- ['father.pl'].
compiling father.pl for byte code...
father.pl compiled, 12 lines read - 1941 bytes written, 14 ms
(2 ms) yes
| ?- grandfather(X,yuqing).
X = jianbo ?
(1 ms) yes | ?-
5. 总结
学习prolog需要的是改变思考方式,使用逻辑去思考问题。prolog主要应用场合为专家系统和人工智能方面。
具体学习可以参考《The Craft of Prolog》,《七周七语言》等。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· .NET Core奇技淫巧之WinForm使用Python.NET并打包
· Java24你发任你发,我用Java8
· C# 中比较实用的关键字,基础高频面试题!