学习目标:
学习prolog的基础使用。这是一门有趣的小众语言。
学习总结
prolog的基础运算符
``prolog的基础关系定义使用的是谓词
比如定义一个朋友关系
friend(Bill,Ana).
则bill是ana的朋友,但反过来并不成立。
friend(Ana,Bill),friend(Bill,Ana).
则可以完整定义出两人的关系。其中", “的意思是and。与此相对的是” ; "它的意思or。
除此之外,prolog还给出了一个推理符号“ :- ”它相当于if。当符号右边的条件满足时,它就执行左边的谓词。
prolog判断时总是从左至右。
prolog的语句以”.“作为结尾标志。
prolog中的变量以大写字母作为开头,小写字母作为常量。
parent(Bill,Ana):-mother(Bill,Ana).
couple(K,J):-father(Bill,K),mother(Bill,J).
第一行式子,当ana是bill的母亲的时候,ana与bill建立parent关系。
第二行式子,当K是bill的父亲且J是bill的母亲时,K和J建立夫妻关系。
prolog的回溯设置
当prolog遇到产生多结果的语句的时候,进行回溯标记。当前路不同时prolog会回溯到最近的一个回溯点进行操作。
我个人的理解是,prolog每次都是查询出结果中的一个,然后设置回溯点,再执行下一条语句。若是此路不通,则回溯上去给出上一次查询点的下一个结果。若是查询不出其他结果了,那就是查询失败了。
使用书上的栗子:定义谓词
parent(Person,Parent):-
mother(Person,Parent);
father(Person,Parent).
father(AA,BB).
parent(BB,CC).
首先程序查询满足father关系的AA与BB,得到A1与B1,为parent设置回溯点。
执行parent,parent包含一个分支,有多结果。为father设置回溯点,执行mother,若mother失败则执行father(2)。若father(2)失败则回溯到father(1)得到另一个结果,再设置回溯点再执行。直到得到所有尝试完成。
递归
懂的都懂,这里只抄一个递归的格式。
创建ancestor递归查询谓词。
ancestor(Person,Ancestor):-parent(Person,Ancestor).
ancestor(Person,Ancestor):-parent(Person,P1),ancestor(P1,Ancestor).
下面代码会返回所有的先祖
ancestor("bill",AA).
write(AA).
可以在末尾添加fail谓词,使输出一个祖先程序就失败。
ancestor("bill",AA).
write(AA).
fail.