2-4 混合查询 我们可以把简单的查询连接起来,组成一些较复杂的查询。例如,如果我们想知道厨房里能吃的东西,就可以向Prolog进行如下的询问。
?-location(X,kitchen),edible(X).
简单的查询只有一个目标,而混合查询可以把这些目标连接起来,从而进行较为复杂的查询。上面的连接符号’,’是并且的意思。
上面的式子用语言来描述就是“寻找满足条件的X,条件是:X在厨房里,并且X能吃。”如果某个变量在询问中多次出现,则此变量在所有出现的位置都必须绑定为相同的值。所以上面的查询只有找到某一个X的值,使得两个目标都成立时,才算查询成功。
每次查询所使用的变量都是局部的变量,它只在本查询中有意义,所以当我们进行了如下的查询后,
?-location(X,kitchen),edible(X).
X=apple;
X=crackers;
no
查询结果中没有broccoli(椰菜),因为我们没有把它定义为可吃的东西。此后,还可以用X进行其他的查询。
?-room(X).
X=kitchen;
X=office;
X=hall;
...;
no
除了使用逻辑的方法理解混合查询外,还可以通过分析程序的运行步骤来理解。用程序的语言来说就是“首先找到一样位于厨房的东西,然后判断它能否食用,如果不能,就到厨房里找下一样东西,再判断能否食用。一直如此重复,直到找到答案或把厨房的东西全部查完为止。”
请参照下图来理解。
![](http://imgsrc.baidu.com/forum/w%3D580/sign=ea74061ccefdfc03e578e3b0e43e87a9/f518241f95cad1c8850e0cc5723e6709c83d5175.jpg)
调用查询后,程序将按照下面的步骤运行,请参照上图来理解。
● 搜索第一个目标,如果成功转到2,如果失败则回答’no’,查询结束。
● 搜索第二个目标,如果成功转到3,如果失败转到1。
● 把绑定的变量的值输出。用户输入’;’后转到2。
● 上面的例子中只有一个变量,下面我们再来看一个有两个变量的例子。
?-door(kitchen,R),location(T,R).
R=office
T=desk;
R=office
T=computer;
R=cellar
T='washing machine';
no
上面的查询用逻辑的语言来解释就是:“找房间R,使得从厨房到房间R有门相连,并且把房间R中的物品T(这里是房间R的所有物品)也找出来。”
下面是此查询的单步运行过程。
Goal: door(kitchen,R),location(T,R)
1 CALL door(kitchen,R)
1 EXIT (2) door(kitchen,office)
2 CALL location(T,office)
2 EXIT (1)location(desk,office)
R=office
T=desk;
2 REDO location(T,office)
2 EXIT (8) location(computer,office)
R=office
T=computer;
2 REDO location(T,office)
2 FAIL location(T,office)
1 REDO door(kitchen,R)
1 EXIT (4) door(kitchen,cellar)
2 CALL location(T,cellar)
2 EXIT (4) location('washing machine',cellar)
R=cellar
T='washing machine';
2 REDO location(T,cellar)
2 FAIL location(T,cellar)
1 REDO door(kitchen,R)
1 FAIL door(kitchen,R)
no