Prolog
形式逻辑基础
命题
原子命题由复合项组成。复合项由函子(函数符号)和有序的参数列表组成,只有一个参数的复合项是一元组,有两个参数的是二元组,以此类推。
man(jake) % 一元组
like(bob, steak) % 二元组上述命题没有内在语义,它们的含义可以由我们自行确定。
命题既可以是事实,也可以是疑问。
复合命题包含多个原子命题,它们由逻辑连接符或运算符连接。如下面的连接符:
| 符号 | 含义 |
|---|---|
| \(\lnot\) | 非 |
| \(\cap\) | 合取(与) |
| \(\cup\) | 析取(或) |
| \(\equiv\) | 等价 |
| \(\supset\) \(\subset\) |
蕴含 |
上述符号越往上的优先级越高。
蕴含符号(\(A\supset B\)或\(A\to B\))只有当\(A\)为真\(B\)为假时才为假。封闭世界假设:比如司法系统,如果不能证明一个人有罪,那他就无罪。因此蕴含的前件如果为假,则不能说明命题为假,因此都为真。
量词包括如下两个。只有引入了量词,变量才可以出现在命题中。
| 名称 | 符号 | 含义 |
|---|---|---|
| 全称量词 | \(\forall X.P\) | 对于所有的\(X\),\(P\)都是真命题 |
| 存在量词 | \(\exists X.P\) | 存在一个的\(X\),使得\(P\)为真命题 |
子句形式
子句形式命题的语法如下: \[ B_1\cup\cdots\cup B_n\subset A_1\cap\cdots\cap A_n \] 它表示:如果所有的\(A\)都为真,那么至少有一个\(B\)为真。它的特征是不需要存在量词。子句形式命题的右边称为前项,左边称为后项。举例如下: \[ likes(bob,trout)\subset likes(bob,fish)\cap fish(trout) \] Horn子句:左侧(也叫首部)只有一个原子命题或左侧是空命题。
- 带左部的Horn子句称为有首部Horn子句,用于陈述关系,如上面的例子;
- 左侧为空的Horn子句称为无首部Horn子句,用于陈述事实。
谓词演算
解析是一种推理规则,它允许从给定的命题中推算出隐含的命题。如下面的例子,解析就是把左边的或起来,右边的与起来,去掉两边相同的。 \[ \begin{align} father(bob,jake)\cup mother(bob,jake)&\subset parent(bob,jake)\\ grandfather(bob,fred)&\subset father(bob,jake)\cap father(jake,fred)\\ \end{align} \] 可以解析为: \[ mother(bob,jake)\cup grandfather(bob,fred)\subset parent(bob,jake)\cap father(jake,fred) \] 命题中的变量需要使用解析来找到变量的值,为变量确定值的过程称为合一,将值临时赋值给变量以实现合一的过程称为实例化。
Prolog语法
常用
?-是命令提示符,write()用来输出,nl表示换行,命令以.结束。会返回一个true.。
?- write('Hello,'), nl, write('world').
Hello,
world
true.?- halt. % 退出常量和变量
常量:小写字母开头;变量:大写字母开头。
?- write(abc).
abc
true.
?- write(Abc).
_250
true.abc是常量,输出自身;Abc是变量,输出该变量的值。
事实陈述
friend(jack, peter). % jack和peter有friend关系
male(jack). % jack有male属性规则语句
即有首部Horn子句。:-表示推理,多个条件用,分隔,\+表示取反。
mother(X, Y) :- child(Y,X), female(X).
onesidelove(X, Y) :- loves(X, Y), \+ loves(Y,X).目标语句
即无首部Horn子句。系统会做出true或false的回答,如果有变量,系统会尝试通过合一找到变量的实例化。
man(fred).
father(X, mike).算术
is可以进行算术运算。但右边的变量必须是已经实例化的。
A is 2 + 1.
B is A * 2.例子
简单使用
先写一个test.pl脚本:
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).在SWI-Prolog里加载脚本,返回true.表示加载成功。
?- [test].
true.下面是一些查询:
?- friend(john, jack).
true.
?- friend(john, sam).
false.
?- listing(friend). % 列出所有关系
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).
true.
?- friend(john, X). % 查询X
X = julia ; % 输入一个;就会继续查询
X = jack.着色问题
相邻的区域不能是同一种颜色。
% 三种颜色
color(red).
color(green).
color(blue).
colorify(A,B,C,D,E) :-
color(A), color(B), color(C), color(D), color(E),
\+ A=B, \+ A=C, \+ A=D, \+ A=E, % A和BCDE相邻
\+ B=C, \+ C=D, \+ D=E. % BC、CD、DE相邻?- colorify(A, B, C, D, E).
A = red,
B = D, D = green,
C = E, E = blue ;
A = red,
B = D, D = blue,
C = E, E = green ;
A = green,
B = D, D = red,
C = E, E = blue ;
A = green,
B = D, D = blue,
C = E, E = red ;
A = blue,
B = D, D = red,
C = E, E = green ;
A = blue,
B = D, D = green,
C = E, E = red ;
false.