• 规则的应用:
• 例: 一个普通的规则
• greatgrandparent(GGP,GGC) :- <-----------------------规则头
• parent(GGP,GP), <-----------------------规则条件
• parent(GP,P),
• parent(P,GGC).
•
• 我们可以把规则理解为一个函数,这是一个有递归与回溯的函数. 比如parent(GGP,GP)被通过了验证,则GGP,GP的值则被确定了,然后把GP代入到parent(GP,P)中一旦通过了验证则P也被确定了,以此类推,当parentGGP,GP), parent(GP,P),parent(P,GGC).都被确定时,则它们的父结点greatgrandparent(GGP,GGC)中的GGP,GGC则被确定了,从而求解过程结束.
我们来看一个程序:
parent(kim,holly).
parent(margaret,kim).
parent(margaret,kent).
parent(esther,margaret). parent(herbert,margaret).
parent(herbert,jean).
greatgrandparent(GGP,GGC) :-
parent(GGP,GP), parent(GP,P), parent(P,GGC).
其知识树是这样的:
我们输入如下语句:
?- greatgrandparen(esther,GreatGrandchild),
write(GreatGrandchild), write("/n").
得到结果:
holly
Yes
我们进一步来设计一个模拟数据库
源程序:
% Database
course(logic, time(monday, 8, 10), dave, a12).
course(java, time(tuesday, 9, 11), ad, r204).
lecturer(Lecturer,Course) :-
course(Course,_,Lecturer,_). %_代表忽视参数
duration(Course,Length) :-
course(Course,time(_,S,F),_,_),
Length is F-S. %is 是一种赋值运算符
teaches(Lect,Day) :-
course(_, time(Day,_,_), Lect, _).
occupied(Room,Day,Time) :-
course(_,time(Day,S,F),_,Room),
S =< Time,
Time =< F.
在命令行中我们可以尝试数据的查询了:
1 查询是谁在教logic这门课
?- lecturer(L, logic), write(L), write("/n").
结果:
dave
yes
2 查询是谁在星期三占用了r204房间
?- occupied(r204, wednesday, Time).
结果:
no