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.