一些语法
- 命名规则:
- 变量名第一个字母小写为常量。比如:letter、number等
- 变量名第一个字母大写或以下划线开头则为变量。比如:Variable或_Variable。
- 逻辑运算符
- 和:, (逗号)
- 或:; (分号)
- 事实
constant(name1, name2,...).
%%% 比如(以上篇提到的'likes.pl'中为例):likes(sam,dahl).
- 规则
head(name1,name2,...):-
fait1(name1,name2,...),
fait2(name1,name2,...),
...
faitn(name1,name2,...).
/*比如(以上篇提到的'likes.pl'中为例):
likes(sam,Food) :-
indian(Food),
mild(Food).
*/
第一个规则
假设我们现在要描述以下家谱图:
/*
已知事实如下:
*/
parent(lansford,peter).
parent(peter,alice).
parent(alice,altha).
parent(peter,ella).
parent(ella,earl).
parent(lansford,charles).
parent(charles,mary).
parent(mary,adam).
parent(charles,laura).
parent(laura,rose).
parent(charles,carrie).
-
若想要得知祖父子关系,则规则grandParent为:
当且仅当grandParent(X,Y) 中,X为Y的祖父(母)时,返回值为真。
<答案点我>
grandParent(X,Y):- parent(X,T),parent(T,Y). -
若想知道父/母和子/女关系,则规则child为:
当且仅当child(X,Y) 中,X为Y的子女时,返回值为真。
<答案点我>
child(X,Y):- parent(Y,X). -
若想知道祖辈,则规则ancestry为:
当且仅当ancestry(X,Y) 中,X为Y的父母辈或祖父母辈时,返回值为真:
<答案点我>
ancestry(X,Y):- parent(X,Y); grandParent(X,Y). -
若想知道两人是否为同一代人,则规则genaration为:
当且仅当 generation(X,Y) 为同一代人时,返回值为真。
<答案点我>
generation(X,Y):- parent(Z,X),parent(Z,Y),dif(X,Y). generation(X,Y):- parent(Z,X),parent(Q,Y),generation(Q,Z). /*即证明要么X,Y有相同的父母,且X,Y不为同一个人(这里用到了函数dif)。 或证明X,Y的父母为同一代人。*/这里用到了一点递归函数的概念,如果不清楚的话可以参考一下这篇: 递归函数