第九章 句法分析

  9.9.3 Prolog语言的句法
  Prolog语言的数据对象叫做项。-个项是-个常量、-个变量或一个复合项。
  常量包括整数,如0,1,99,和原子,如a,sentence,noun-phrase,=,[],'Algol-68',→等等。常量用来指明确定的基本对象。
  变量的第一个字符必须是一个英文大写字母,如X,Value,Al等。一个变量用来表示某个特指的未确定对象。
  复合项是一种结构化的数据对象。-个复合项由-个函子和若干变元组成。一个函子则由其名字和变元数来描述。例如函子名为point、变元数为3的一个复合项可记作:
  point(X,Y,Z)
你可以把函子看作是-个记录类型,把复合项的变元看作是-个记录中的域。复合项通常可以用树来表示。例如项
  S (np (john), vp (v (likes), np (mary)))
可以表示成图9.16所示的结构。在Prolog中复合项有时可以用中缀标记法来代替前缀标记法。例如前缀式:
  +(X,Y) ;(P,Q)<(X,Y)
可以分别用中绍式表示为:
  X+Y   P;Q   X<Y
  (X加Y) (P)或Q)  (X小于Y)

图示


图9.16 复合项s(np(john),vp(v(likes),np(mary)))的树形图


此外原子可以看作是变元数为零的函子。
  表是Prolog的一种重要的数据结构,其本质同Lisp语言中的表-样。一个表要么是一个原子"[]",表示空表:要么是一个函子名为"・"的复合项,它有两个变元,分别代表一个表的头和尾。因此由整数1,2,3组成的表具有如图9.17所示的结构。如果用Prolog的标准句法表示.它应当是
  ・(1, ・ (2, ・ (3,[]))),
但通常我们用如下的简单标记如表示它:
  [1,2,3]。
当一个表的尾是一个变量时,可以用如下的方式来表示:
  [X|L]

  [a,b| L]。
它们分别对应于图9.18(a)和(b))的结构。
  下面是Prolog的一段简单程序,它包括
  事实:
likes(mary,food).
     likes(mary,wine).
     likes(john,wine).

  规则:
likes(john,X) :-likes(X,wine).

图示

图9.17 表[1,2,3]的结构


图9.18 表尾为变量时的表结构

(john喜欢任何一个喜欢酒的人。)

以上构成了Prolog的数据库,下面是用户输入的询问和机器的回答:
  ? -likes(mary,mony),
    no
  ? -1ikes(mary,wine).
    yes
  ? - likes(mary,X).
    (有什么东西是mary喜欢的?)
    X=food:
    X=wine;
    no (more answers)
  ? -1ikes(mary,X),likes(john,X).
    (有什么东西是mary和john都喜欢的?)
    X=wine;
    no (more answers)
  ? - likes(john,X).
    X=wine;
    X=mary;
    X=john;
    no (more answers)