Prolog语言(耐心看完-你就入门了)剖析
(事实)
f m j s w
goal
likes(m, X), likes(j, X). (问题) 问题:是否 m 和 j 都喜欢什么东西?( X = ? )
2018/10/14
likes(m, f).
likes(m, w).
likes(j, w).
Prolog的求解过程
likes(j, s).
现在有两个问题:likes(m, X) 和 likes(j, X)) 第一步 :第一个问题 likes(m, X) 去与事实匹配
“ :- ”
“ ,”
表示“蕴涵”
表示“合取”
含义:若 P1 , … , Pn 均为真时,P为真
2018/10/14
③问题(目标) Goal
Q1 , Q2 , … , Qm
.
含义:待回答的问题,即 Q1 , … , Qm 同时
2018/10/14
为真吗?
从消解角度来看: ①(事实)中,P是Horn子句
2018/10/14
likes(j, s).
2018/10/14
第三步:回到第一个问题 likes(m, X) ,重新匹
配,得到 { w / X}
likes(m, X) likes(j, X)
第四步:第二个问题变成 likes(j, w)。再与事实 匹配,成功
likes(m, f).
第五步:答案就是 X=w
likes(m, w). likes(j, w). likes(j, s).
问题求解就是Horn子句集消解
2018/10/14
3 表结构
表:若干个元素的有序序列
表中的元素:常量、变量、项、表
表用“[ 开
2018/10/14
]”来表示,元素之间用逗号或者空格分
例:
[1, 2, 3]
[a, b, c, d]
2018/10/14
பைடு நூலகம்
用符号“ | ”来划分表头(第一个元素)和表尾
2018/10/14
②(规则)可以表示为
P1∧P2∧…∧PnP
可以转化为 ~P1∨~P2∨…∨~Pn∨P 也是Horn子句,并受全称量词约束
2018/10/14
③(问题)是
Q1∧…∧Qm
受存在量词约束,取非后 ~Q1∨…∨~Qm 受全称量词约束,是Horn子句
2018/10/14
Prolog三种形式的语言都是Horn子句
必定引起回溯
2018/10/14
例:求 1 到 n 之间的和
定义一个二元谓词 sum(N, X),其中 X 表示和 sum(1,1):-!. sum(N,R):- N1=N-1, sum(N1, R1), R=R1+N. ?- sum(6,X). 答案是:X=21 去掉“ !”,会发生什么?
2018/10/14
⑤ 语句句型少,语法简明。只有三种句型
2018/10/14
参考资料:
1 雷英杰,张雷,邢清华,孙金萍。Visual Prolog 语言教程。西安:陕西科学技术出版社,2002
年2月(380页,35元)
2 雷英杰,邢清华,孙金萍,张雷。Visual Prolog 编程、环境及接口。北京:国防工业出版社, 2004年1月(412页,36元)
项的定义:
<项>::= <常量> | <变量> | <复合项>
2018/10/14
<项>::= <常量> | <变量> | <复合项>
<常量>::=<原子> | <数> <原子> ::= <标识符原子> | <字符串原子> | <特殊原子>
2018/10/14
标识符原子
命名 :用小写字母或者小写字母开头的小写字母 数字串
(其余元素)
特例: 当只用一个元素时,表尾为空 空表(无元素),既无表头又无表尾
2018/10/14
例: P([the, cat, sat, down]).
?- P([ X | Y ]).
答案:X=the, Y=[cat, sat, down]
?-P([ X , Y | Z ]).
答案:X=the, Y=cat,Z=[sat, down]
2018/10/14
4 Prolog程序的结构
Prolog的程序分为两部分:
前提部分:所有事实和规则 问题部分:目标子句序列
2018/10/14
注意:
这两部分不能颠倒。必须前提部分写在前 面,问题部分写在后面
2018/10/14
likes(m, f).
likes(m, w).
likes(j, w). likes(j, s).
(置换与合一),按顺序得到 {f/X}
2018/10/14
第二步:f 代替第二个问题 likes(j, X) 中的 X,
则得 likes(j, f) 。再与事实匹配,不能匹配, 失败,则回溯,忘掉刚才的匹配
likes(m, f). likes(m, X) likes(j, X) likes(m, w). likes(j, w).
人
工
智
能
Artificial Intelligence (AI)
2018/10/14
Prolog 语言简介
Prolog语言是一种以一阶谓词为基础的逻辑性语
言(Programming in Logic)
2018/10/14
Prolog语言的特点
Prolog语言的基本内容
简单的例子
2018/10/14
<原子>(<项>{, <项>}) <项> <原子> <项> { <原子> <项> }
2 Prolog中的语句
Prolog中的语句分成三种形式: ①事实: P. 含义:无条件成立,恒为真 例:like( monkey, banana)
2018/10/14
②规则: P :- P1 , P2 , … , Pn .
2018/10/14
Prolog语言的基本内容
1 项 2 Prolog中的语句 3 表结构 4 Prolog程序的结构
5 常用内部谓词
6 Prolog程序设计步骤
2018/10/14
1 项
符号说明:
“ ::= ” “|” “{}”
2018/10/14
表示“ 定义为 ” 表示 “ 或 ”,可选 表示 “ 重复或者出现多个 ”
?- uncle(a, U).
问题: a 是谁的叔叔 ? ( U = ? )
2018/10/14
Prolog的求解过程:
第一步:问题 uncle(a,U) 与事实逐个匹配,
不成功
father(a, b). father(c, d).
brother(a, c).
2018/10/14
uncle(a,U) uncle(X, Y) :- brother(X, Z) , father(Z, Y). 第二步:与规则头(左部)匹配,即寻找合一者, 有 {a/X, U/Y} 转化为两个子问题:brother(a, Z)和father(Z, U)
①若与另一个未实例化的变量 匹配 ,则视为同一变
量,两者共享
②若与另一个实例化的变量 匹配 ,也变成了实例化 的变量,且两者同值
③若与常量匹配,也变成了实例化变量,并取常量
的值
2018/10/14
第三、常量只能与相同的常量匹配
第四、实例化的变量与另一个实例化的值相同的 变量匹配,也可以与另一个未实例化的变量匹
2018/10/14
复合项:由一组其它对象组成的单个对象
例: 函数项: like(john, apple) 表: [sa, sb], [1,2,3]
表达式: (12+59)*49-96
2018/10/14
项
常量 原子
标 识 符 原 子
2018/10/14
变量 数
特 殊 原 子
复合项
字 符 串 原 子
对于“=”(赋值与比较)的几点说明: 第一 、当一个变量已经 实例化 ,则可以与任意 未实例化的变量相等,且将其实例化(赋值
功能)
第二、两者均未实例化,eq(X, Y) 恒为真,并 视为同一变量
2018/10/14
第三、均以实例化,由当前值来决定
第四、如果为表,要求对应的元素相等,才为真 第五 、如果是谓词,谓词 同名 ,变元个数相等,
对应的变元相等
2018/10/14
③输入输出谓词
第一、write(X):向输出设备输出实例化结果 第二、read(X): 当 X 未实例化时,输入一个项
当 X 在输入前已经实例化,则读入项将与 X
匹配,根据匹配的成功与否,决定其真假值
2018/10/14
④谓词cut与fail(特殊谓词):
cut ( ! ):禁止回溯
配,使另一个变量实例化,且约束值相同
2018/10/14
5 常用的内部谓词
内部谓词:Prolog系统本身定义的一些基本谓词
注意:可以直接使用,用户不能修改
2018/10/14
①算术运算
算术表达式由操作数(数、变量)、操作符和括
号组成
算术运算符号:“+、-、* 、/”(加减乘除)
2018/10/14
6 Prolog程序设计步骤
对应于Prolog程序的组成部分,设计步骤分为:
第一、说明事实:说明与待求解的问题有关的事
实。例如,人物事及相互关系,对应于 叙述
Prolog语言(耐心看完-你就入门了)剖析
名的对象,用大写字母开头
2024/7/16
特殊变量:空变量,记作:“_” 含义:我们对问题的某一个变量的值不关心
2024/7/16
<项>::= <常量> | <变量> | <复合项>
<复合项> ::=
<原子>(<项> { , <项> })|
<项> <原子> <项> { <原子> <项> }
也是Horn子句,并受全称量词约束
2024/7/16
③(问题)是 Q1∧…∧Qm
受存在量词约束,取非后 ~Q1∨…∨~Qm
受全称量词约束,是Horn子句
2024/7/16
Prolog三种形式的语言都是Horn子句 问题求解就是Horn子句集消解
2024/7/16
3 表结构
表:若干个元素的有序序列
2024/7/16
项的定义: <项>::= <常量> | <变量> | <复合项>
2024/7/16
<项>::= <常量> | <变量> | <复合项>
<常量>::=<原子> | <数> <原子> ::=
<标识符原子> | <字符串原子> | <特殊原子>
2024/7/16
标识符原子 命名:用小写字母或者小写字母开头的小写字母
不能被重新满不必要的回溯,提高程序运行效率
2024/7/16
prolog语言简介
例:
自动实现的搜索算法之二——回溯 回溯
clauses likes(tom,talk). /*1*/ likes(bill,swim). /*2*/ likes(bill,talk). /*3*/ friend(john,X):-likes(X,talk),likes(X,swim) /*4*/ 设Goal:friend(john,Who)
可以回溯 如果加入 cut p:- q1,q2,!,r1,r2. p:- s1,s2. 逻辑关系变为 P1 if (if q1∧ q2 then r1 ∧r2 else s1 ∧s2 ) then p q1 q2 ! r1 回溯
P P2 P r2 s1 s2
截断 回溯
影响回溯的手段之二——cut 影响回溯的手段之二
影响回溯的手段之二——cut (截 影响回溯的手段之二
断)
cut—无条件成功,并截断回溯
(也可以用! 表示)
影响回溯的手段之二——cut 影响回溯的手段之二
例:p:- q1,q2,r1,r2. p:- s1,s2. 逻辑关系是 if q1∧ q2∧r1 ∧r2 or s1 ∧s2 P P1 then p q1 q2 r1 r2 s1 s2 P2 P
影响回溯的手段之二——cut 影响回溯的手段之二
应改为 legal(X):- super_speed(X),!,fail. legal(X):- drunk_drive(X),!,fail. legal(X).
常识:“外Goal” 和“程序内goal” 有“勤” “懒” 之分
显然,此结果不完备
Press the SPACE bar
影响回溯的手段之一——fail 影响回溯的手段之一
fail—无条件失败,引起回溯
PROLOG语言入门
PROLOG语言入门简介PROLOG语言是一个非常有趣的计算机语言。
它完全不同于我们已经很熟悉的其它计算机语言、例如BASIC、FORTRAN、C等。
主要由于现在的计算机硬件能力的限制,使得PROLOG语言没有得到更广泛的流行。
但是未来随着计算机硬件技术的发展,PROLOG语言将会发挥更大的作用。
尤其是通过PROLOG语言的学习,我们对计算机语言的本质会有更多的了解。
虽然对许多人来说,PROLOG语言比较陌生。
但是PROLOG语言很容易入门,人们很容易感受到它的魅力。
本书在多年从事相关教学的讲义的基础上形成。
本书没有试图写成PROLOG语言程序设计的指导书,而是着重在于于介绍PROLOG的有趣性,引导读者尽快进入PROLOG世界。
同时,尽量利用BASIC、FORTRAN、C等大家熟悉的语言的例子,说明PROLOG与这些语言的区别,以加深读者对PROLOG的理解。
因此,本书适合于PROLOG的初学者,而对于那些已有相当基础、希望利用PROLOG开发应用程序的读者,则可以选择其它更加全面的书籍,例如本书末尾所推荐的那些书籍。
目录1引言2为什么有PROLOG3什么是PROLOG ?4最简单的PROLOG程序5PROKOG运行方式6关于Visual PROLOG ?7Visual PROLOG的运行方式8PROKOG入门9规则与事实10递归11表12引言首先,介绍一种常见的扑克牌游戏。
该游戏方法为:“随意抽出4张扑克牌。
然后利用加、减、乘、除方法,对这个4张扑克牌所代表的4个数进行四则运算。
要求最后的运算结果为24。
注意,每个数只能在运算中出现1次,且必须出现1次。
”例如,如果所抽取的4张牌所代表的4个数分别为:2,4,7,9。
则可以采用如下运算方法:2 * 4 + 9 + 7 = 24有时,同一数字组合,可能存在好几种四则运算方法。
游戏时,可以规定先找到相应的四则运算方法的人获胜。
有些数字组合比较容易计算,例如6,6,6,6。
Prolog学习:基本概念
Prolog学习:基本概念对Prolog有了⼀个感性的认识,今天介绍下Prolog中⼀些基本概念,想要⽤Prolog解决⼀些实际问题之前必须要先了解它们。
这些概念在这本书中都有介绍,我简单提炼汇总下,就当给这门⼩众语⾔做个宣传吧。
变量/规则/知识库在Prolog中变量的命名是有特殊要求的,如果⼀个词以⼩写字母开头,它就是⼀个原⼦(atom),类似于其他语⾔中的符号(symbol),如果⼀个词以⼤写或下划线开头,那么它就是⼀个变量,和其他语⾔⼀样变量值可以改变,可以赋值(不过更灵活)。
符号组成⼀些事实:likes(zhangsan,lisi).likes(wangwu,lisi).likes(chenliu,maqi).符号和变量在⼀起可以⽤来定义规则:friend(X,Y):- \+(X = Y),likes(X,Z),likes(Y,Z).事实是我们对这个世界直接观察的结果。
规则是关于现实世界的逻辑推论。
事实 + 规则 = 知识库。
上⾯的规则可以叫做friend/2因为它有两个参数(类似C#⽅法中的形参),:-读作“如果”,“如果”后⾯是由⼀系列“⼦⽬标”组成,⼦⽬标之间可以是且的关系,⽤“,”分割,也可以是或者的关系,⽤“.”表⽰。
Prolog就是通过验证规则来回到我们yes或no的,如果参数能满⾜所有⼦⽬标就是yes。
合⼀(unification)合⼀是Prolog中⼀个⾮常重要的概念。
简单的来说合⼀就相当于其它语⾔中的赋值:cat(lion).cat(tiger).dorothy(X,Y,Z) :- X = lion,Y = tiger,Z = bear.twin_cast(X,Y) :- cat(X),cat(Y).合⼀的意思是:找出那些使规则匹配的值。
所以执⾏dorothy(lion,tiger,bear).这句,Prolog会返回yes:dorothy/3规则的右侧,Prolog将lion赋值给X,tiger赋值给Y,bear赋值给Z,就像在命令式语⾔中这样:var X = lion;var Y = tiger;var Z = bear;这些值和左侧(也就是dorothy(lion,tiger,bear))对应的值相匹配,所以合⼀成功。
7 智能控制语言prolog
7.1 什么是Prolog语言
❖ Prolog程序的特点
Prolog程序没有特定的运行顺序,其运行顺序 是由电脑决定的,而不是编程序的人
7.2 Prolog入门---事实
❖ 事实 的语法结构--(原子)
原子通常是字母和数字组成,开头的字符必须是小写字母。 例如:
hello twoWordsTogether x14 为了方便阅读,可以使用下划线把单词分开。例如
a_long_atom_name z_23
下面的是不合法的原子: 123nodigitsatbeginning Nocapsfirst 下划线不能放在最前面
程中出现的程序。
和其他的语言一样,最好的学习方法是实践。本课程 将使用swi Prolog的解释器来向大家介绍几个具语言
❖ 角色扮演游戏-小女孩找毛毯
假设你所扮演的角色是一个三岁的小女孩,你想睡觉了,可是没 有毛毯(nani)你就不能安心的睡觉。所以你必须在那个大房子 中找到你的毛毯,这就是你的任务
7.2 Prolog入门---事实
❖ 角色扮演游戏-小女孩找毛毯
定义手电筒(由于是晚上,玩家必须找到手电筒,并打开 它才能到那些关了灯的房间)的状态和玩家的初始位置。
turned_off(flashlight). here(kitchen).
7 智能控制语言 Prolog
7.1 什么是Prolog语言 7.2 Prolog入门---事实 7.3 Prolog入门---查询 7.4 Prolog入门---规则 7.5 Prolog入门---算术 7.6 Prolog入门---内部谓词 7.7 Prolog入门---递归和表 7.8 Prolog入门---截断
人工智能语言—Prolog
其次,调用过程AT(Zhang, x),从而产生新目标 T(Zhang, train),与事实匹配,产生目标 ⊓ 。因而调用成功,输出“True”。
高级人工智能
5
人工智能语言—Prolog语言
高级人工智能
10
人工智能语言—Prolog语言
Prolog的构成
目标(问题):关于对象性质或关系的询问。 ?— student(john) ?— married(mary,x)
高级人工智能
11
人工智能语言—Prolog语言
Prolog语言的基本文法
Prolog语言的最基本语言成分是项(term)
定理证明、智能问题求解、计算机辅助设计、规 划生成等领域。
高级人工智能
8
人工智能语言—Prolog语言
Prolog的构成
事实:事实用来说明一个问题中已知的对象和它们之间 的关系。在Prolog程序中,事实由谓词名及用括号括起 来的一个或几个对象组成。谓词和对象可由用户自己定 义
student(john) married(tom, mary) likes(bill,book)
Prolog语言及其基本结构
Prolog是当代最有影响的人工智能语言之一, 由于该语言很适合表达人的思维和推理规则, 在自然语言理解、机器定理证明、专家系统 等方面得到了广泛的应用,已经成为人工智 能应用领域的强有力的开发语言。
高级人工智能
6
人工智能语言—Prolog语言
现在的Prolog语言有许多版本
项或者是常量,或者是变量,或者是一个结构。
逻辑型程序设计语言PROLOG详细教程
逻辑型程序设计语言PROLOG教程2.3. 1逻辑型程序设计语言PROLOGPROLOG的语句PROLOG语言只有三种语句,分别称为事实、规则和问题。
1.事实(fact)格式: <谓词名>(<项表>).功能一般表示对象的性质或关系。
其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。
例如:student(john).like( mary ,music).表示“约翰是学生”和“玛丽喜欢音乐”。
2. 规则(rule)格式:<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能: 一般表示对象间的因果关系、蕴含关系或对应关系。
其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),{}表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。
例如:bird(X):-animal(X),has(X,feather).grandfather(X,Y):-father(X,Z),father(Z,Y).第一条规则表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X 是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。
3.问题(question)格式: ?-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能表示用户的询问,它就是程序运行的目标。
例如:?-student(john).?-like(mary,X).2.3. 2 PROLOG程序PROLOG程序一般由一组事实、规则和问题组成。
问题是程序执行的起点,称为程序的目标。
例如下面就是一个PROLOG程序。
likes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane ,smith).friend(john,X):-likes(X,reading),likes(X,music).friend(john,X):-likes(X,sports),likes(X,music).?-friend(john,Y).可以看出,这个程序中有四条事实、两条规则和一个问题。
Prolog语言基础知识
Prolog语言基础知识一.数据结构PROLOG语言与其他任何一种计算机高级语言一样,有其定义的数据结构。
下面将介绍PROLOG语言的基本数据结构。
1.常量常量是数据结构的基本组成部分,用来对特定对象及关系的命名。
在PROLOG语言中,合法的常量有:(1)整数,一个纯数字串,例 182 000,581 202。
(2)原子,分为两种:1)标识符:以小写字母开头的,包含字母、数字、下划线的串,例aBC12,is_。
2)符号:PROLOG语言规定的符号集的非空序列,例?、-、=。
若原子用单引号厂(‘ ’)括住,则可含有任何字符。
(3)字符集ab...z2.变量变量是用来表示还无法知道且需要PROLOG程序来确定的客体。
变量用变量名表示,变量名与标识符相似,所不同的是以大写字母或下划线开头。
例Variable,_ansure。
PROLOG语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出一位置,称为匿名变量。
用单一的下划线(_)来表示。
比如只想知道是否有人喜欢跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
3.结构结构是PROLOG语言中的第三类数据结构;用于构造PROLOG数据对象。
一个结构是一个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。
其书写形式为函子(分量1,分量2,…,分量n)其中的分量也可以是结构。
例如可用结构描述事实"Mary住zhongshan路120号":person(mary,address(zhongshan,120)).此例中address是一个具有两个分量即路名和门牌号的结构。
该结构是作为事实的一个分量出现,它将作为关系中的一个客体来对待。
当然,结构中的分量也可以是结构,如上例可写成:person(name(mary),address(street(zhongshan),number(120))).其中name,address,street,number均为结构。
prolog教程第10章
2004.11.3
AI程序设计
5
第三部分:第10章 第三部分:第10章 Visual Prolog语言元素 Prolog语言元素
10.2 对象系统
Visual Prolog的对象系统(object system), 包括外部视图(External View)和内部视图 (Internal View)。
interface interfaceAndClassName ... end interface interfaceAndClassName class interfaceAndClassName : interfaceAndClassName ... end class interfaceAndClassName
domains t1 = [1..17]. t2 = [5..13]. t3 = t1 [5..13].
2004.11.3
t1是一个整型变量,取值从1到17(包括端点在内)。 同样,t2取值从5到13,但是t2不是t1的子类型。另 外,t3 (包含与t2一样的取值)则是t1的子类型,因 为这是声明了的。
2004.11.3
AI程序设计
16
第三部分:第10章 第三部分:第10章 Visual Prolog语言元素 Prolog语言元素
10.3.1 名字分类
如果一个作用域声明一个无返回值的变量名字,那么可以声明如下: 一个谓词,或者 一个事实 最后,关于重载。下列实体能够重载: 算符 函数 谓词 一个算符在同一论域内不可以使用两次(即使变元不同)。
本章介绍Visual Prolog 6程序设计语言的语法和语义。Visual Prolog是基于逻辑程序设计语言Prolog的一种强类型的面向对象的程序 设计语言。一个Visual Prolog程序包括一个目标、大量的接口声明和类 的实现程序。 接口、类声明和类实现包括Prolog实体的定义和声明,即 • 论域 • 常量 • 谓词 • 事实数据库 Visual Prolog程序的实际代码中的谓词定义由谓词声明和子句定义 来声明。
《用prolog解决汉诺塔问题》
用prolog解决汉诺塔问题因为没有接触过这种人工智能语言,所以有点战战兢兢,在这里就和大家来分享一下对prolog的理解:要想使用prolog,首先要了解prolog。
1、prolog语句(1)、谓词逻辑谓词,是只用来描述对象的状态、性质及对象之间的关系的词。
逻辑,是指事物的因果关系。
谓词逻辑:就是指利用谓词的行驶,来表达只和和进行因果推理例如:喜欢(小芳,羽毛球)即表示:小芳喜欢羽毛球。
(2)、事实、规则和目标(1)事实事实是prolog中最简单的谓词,一般表示对象的状态、性质或对象之间的关系。
其格式为:谓词(参数1,参数2……)例如:小芳喜欢羽毛球在prolog中可以这样表示:likes(xiaofang,badminton)。
(2)规则当一条事实需要依赖于另一条事实时,需要用规则来表示。
规则可以表示对象之间的因果关系、蕴涵关系或对应关系。
其格式:谓词名1(参数):-谓词名2(参数),谓词名3(参数)……符号“:-”表示如果,右面的谓词是规则的前提,左面的谓词是规则的结论。
例如:凡是喜欢乒乓球的都是小华的朋友。
在prolog中表示为:friend(X,xiaohua):-likes(X,pingpong).(3)目标用户的询问是程序运行的目标。
它可以是一个简单的谓词,也可以是多个谓词的组合。
目标通常直接在程序中写出(成为内部目标),也可以在程序运行时临时给出(成为外部目标)。
“?-”谓词名(参数)……“? –”表示提问例如:谁是小华的朋友?在Prolog中表示为:?-friend(X ,xiaohua)2、prolog的运行机理:prolog求解问题的过程是:从目标出发,不断地进行例化(当某一变量被赋值后就成为约束变量,也可以成为例化)、匹配(当两个谓词的名称相同,参数的个数、类型相同,并且还满足某些条件时,则这两个谓词可以相互匹配),有时还要进行回溯,知道目标被完全满足或不能满足时为止。
