【Prolog学习笔记】第二天:制定第一个规则

174 阅读1分钟

一些语法

  1. 命名规则:
  • 变量名第一个字母小写为常量。比如:letter、number等
  • 变量名第一个字母大写或以下划线开头则为变量。比如:Variable或_Variable。
  1. 逻辑运算符
  • 和:, (逗号)
  • 或: (分号)
  1. 事实
 constant(name1, name2,...).
%%% 比如(以上篇提到的'likes.pl'中为例):likes(sam,dahl).
  1. 规则
 head(name1,name2,...):- 
     fait1(name1,name2,...),
     fait2(name1,name2,...),
     ...
     faitn(name1,name2,...).
/*比如(以上篇提到的'likes.pl'中为例):    
    likes(sam,Food) :-
        indian(Food),
        mild(Food).
*/

第一个规则

假设我们现在要描述以下家谱图:

p2.1.png

/*
已知事实如下:
*/
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).
  1. 若想要得知祖父子关系,则规则grandParent为:

    当且仅当grandParent(X,Y) 中,X为Y的祖父(母)时,返回值为真。

    <答案点我>

           grandParent(X,Y):-
               parent(X,T),parent(T,Y).
    
  2. 若想知道父/母和子/女关系,则规则child为:

    当且仅当child(X,Y) 中,X为Y的子女时,返回值为真。

    <答案点我>
          child(X,Y):-
            parent(Y,X).
    
  3. 若想知道祖辈,则规则ancestry为:

    当且仅当ancestry(X,Y) 中,X为Y的父母辈或祖父母辈时,返回值为真:

    <答案点我>
        ancestry(X,Y):-
            parent(X,Y);
            grandParent(X,Y).
    
  4. 若想知道两人是否为同一代人,则规则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的父母为同一代人。*/
        
    

    这里用到了一点递归函数的概念,如果不清楚的话可以参考一下这篇: 递归函数