今天在《七周七语言》中接触到了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》,《七周七语言》等。
Prolog奇怪奇妙的思考方式的更多相关文章
-
不管你以后写不写JS,都应该学会这种思考方式
昨天在网上看到了一篇文章说程序员写不过35这种说法,但事实上,确实并不能每个人都像我一样,在写JS中找到乐趣,就乐意写这东西直到50岁眼瞎为止. 那肯定有人要问,也许我不仅写JS写不到35,可能我连3 ...
-
Android图表库MPAndroidChart(六)——换一种思考方式,水平条形图的实现过程
Android图表库MPAndroidChart(六)--换一种思考方式,水平条形图的实现过程 一.基本实现 我们之前实现了条形图,现在来看下水平条形图是怎么实现的,说白了就是横起来,看下效果: 说起 ...
-
思考方式--SMART原则
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 万事开头于你目标的设定,如果开始走错了,那么后面的路将会更加的错误,甚至于更加的努力 ...
-
vs2017 遇到异常。这可能是由某个扩展导致的。奇妙的解决方式
最近在使用visual studio 2017 创建.netcore 2.2的MVC项目后,在View里面拖拽引用css或js文件时总出现“遇到异常.这可能是由某个扩展导致的.” 然后在网上找了大半天 ...
-
这个随笔用用来放一些好的思想和思考方式(暂时secret)
一: 给你一个只有4和7的数字,求这是第几个幸运数字? 思路: 我们把4映射成0,7映射成1,然后就如下枚举:0,1,00,01,10,11.因为是映射的,所以可以前导0,然后我们就会知道给出的那个数 ...
-
奇怪的transform bug
对一个元素使用transform:rotate 进行旋转,造成: 父元素的背景图位置偏移,往下降,背景图也会变模糊一些 造成重绘,导致该元素后面的兄弟元素受到影响,变得模糊,并且无法遮盖住父元素的背景 ...
-
Rolf Dobelli 《清醒思考的艺术》
为了避免输光自己靠勤奋积累的财产,罗尔夫·多贝里列了一份系统性思维错误的清单.这一份清单可以和查理·芒格的<人类误判心理学>对照查看. 自本杰明·富兰克林以来,电闪雷鸣没有减少变弱或响声变 ...
-
思考力&mdash;&mdash;提升企业竞争力的核心因素
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 · 思考力就是竞争力:在这个科技飞跃进步的时代,很多事物是我们未曾经历也难以预料的. ...
-
cocos-html5 Json 灵活 遍历方式 不同方式的缺陷,优点总结
1,四种解析Json的方式:Part 1 var list1 = [1,3,4]; alert(list1[1]); var list2 = [{"name":"leam ...
随机推荐
-
java.sql.SQLException: Incorrect key file for table &#39;C:\Windows\TEMP\#sql578_6e2_68d.MYI&#39;; try to repair it
java.sql.SQLException: Incorrect key file for table 'C:\Windows\TEMP\#sql578_6e2_68d.MYI'; try to re ...
-
简单排序算法 C++类实现
简单排序算法: 冒泡排序 插入排序 选择排序 .h代码: // // SortClass.h // sort and selection // // Created by wasdns on 16/1 ...
-
Piggy-Bank_完全背包
Description Before ACM can do anything, a budget must be prepared and the necessary financial suppor ...
-
团体程序设计天梯赛-练习集L1-014. 简单题
L1-014. 简单题 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这次真的没骗你 —— 这道超级简单的题目没有任何输入. ...
-
Miles per gallon to kilometers per liter
Miles per gallon to kilometers per liter 1 Imperial Gallon = 4.54609188 litres 1 Mile = 1.609344 kil ...
-
HTML基础知识(未完待续)
一.HTML编辑工具:Sublime Text 二.HTML实体字符:1.( 空格): : 2.(<) <: 3.(>)>: 4.(&)&a ...
-
form表单老忘的
禁止拉伸 textarea{ resize:none; } 左侧 label 对齐注意事项 必须要和 label-width 共同使用,才会生效. 表单域标签的宽度,直接写入 Form, 子元素 fo ...
-
HDU 2874 Connections between cities(LCA Tarjan)
Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...
-
《SQL 基础教程》第二章:查询基础
这一章的结构如下: SELECT 语句基础 算术运算符和比较运算符 逻辑运算符 SELECT 语句可用于查询数据,并且可以设定条件来查询具有特定值的记录.条件的设定就需要算数运算符.比较运算符和逻辑运 ...
-
SparkR初体验2.0
突然有个想法,R只能处理百万级别的数据,如果R能运行在Spark上多好!搜了下发现13年SparkR这个项目就启动了,感谢美帝! 1.你肯定得先装个spark吧.看这:Spark本地模式与Spark ...