N4真题阅读
养不同的宠物,喜欢不同的饮料,抽不同牌子的烟。现在我们知道了以下信息。
一个英国人住在一栋红色的房子里。
那个西班牙人有一只狗。
挪威人住在左边第一栋房子里。
黄色房子里的人喜欢抽库尔斯牌香烟。
抽切斯特菲尔德香烟的人和养狐狸的人是邻居。
挪威人住在蓝房子旁边。
温斯顿吸烟者有一只蜗牛。
抽好彩香烟的人喜欢橙汁。
乌克兰人喜欢喝茶。
日本的烟雾议会。
抽库尔斯香烟的人是养马的人的邻居。
喜欢咖啡的人住在绿色的房子里。
绿房子在象牙房子的右边(图中右边)。
中间房子的人喜欢喝牛奶。
根据以上条件,请问哪些房子的人养斑马,哪些房子的人喜欢斑马?
你想喝水吗?或者你能把所有东西放在正确的地方吗?
这是典型的条件问题。根据每个条件,我们可以排除一些情况,直到最
然后找到答案。但是因为这个问题条件太多,手动回答会花一点时间。
间歇我们不妨利用这段时间编个程序,让计算机来答。真的,编程需要时间。
时间必须小于手工计算!
Prolog用于解决这类问题,一般采用“选择并复核”的方法。也就是某一方
该方法提出一系列可能的解,然后验证部分判断这个解是否符合问题的含义。直到我们找到答案。
目前为止。
我们先分析一下有多少种可能的解决方案。
每个房子都有不同的颜色,所以就颜色而言,有5种!这种情况,和一个* * *有五个特点:严
肤色、国籍、宠物、香烟和饮料。所以一个* * *有5个!*5例,即600例。不多,
你可以用程序把它全部列举出来。
下面介绍如何使用Prolog编写求解程序。
在这个程序中,结构h(C,N,P,Y,D)用于存储房间信息。c,n,p,y,d分别对应颜色。
国籍,宠物,香烟和饮料。因为有五个房间,所以使用一个列表来存储所有房间的信息。
。这个列表是:
).
x = 5;
x = 3;
不
显然,next在列表中找到了与4相邻的元素。这里列出的元素很简单。
数字,如果是上面提到的表示房间信息的结构h(C,N,P,Y,D),作用是一样的。
前面说了,我们会用“选择再检查”的方法找出答案,那么我们选择什么呢?
?这里将使用前面介绍的member/2谓词。还记得member/2的定义吗?
成员(A,)。
是
我们已经说过,Prolog谓词可以以多种方式使用,因此member/2也可以用于遍历列表。
所有元素。
-成员(X,)。
x = 1;
x = 2;
x = 3;
x = 4;
x = 5;
不
这正是我们需要的功能,我们可以通过使用它来选择所有的情况。
有了以上准备,就可以开始正式写答案部分了。我们先列出程序。
,然后再来解释。解决问题的谓词是solve/3,第一个参数x返回。
房间列表,第二个参数TT返回斑马主人居住的房间,第三个参数TTT返回喜欢喝水的人。
人民的房间
求解(X,TT,TTT):-
%首先,将X绑定为房间列表。注意,此时房间的属性是不确定的,所以使用变量。
代表。
X=[h(C1,N1,P1,Y1,D1),h(C2,N2,P2,Y2,D2),h(C3,N3,P3,Y3,D3),h(C4,N4,P4,
Y4,D4),h(C5,N5,P5,Y5,D5)],
%的英国人住在红色的房子里。
Member(Z1,X),%首先从X列表中选择一个房间Z1。
颜色(z1,红色),% z1的颜色是红色。
民族(z1,英国人),居住在% z1的人是英国人。下同。
%的西班牙人养狗。
成员(Z2,X),
宠物(Z2,狗),
民族(Z2,西班牙人),
%的挪威人住在左边第一栋房子里。
首先(Z3,X),
民族(Z3,挪威语),
黄色房子里%的人喜欢抽库尔斯牌香烟。
成员(Z4,X),
颜(Z4,库尔斯)、
颜色(Z4,黄色),
%吸切斯特菲尔德香烟的人与养狐狸的人是邻居。
成员(Z5,X),
宠物(Z5,狐狸),
Next(Z6,Z5,X),%与next(Z5,Z6,X)相同。
颜(Z6,切斯特菲尔德)、
%的挪威人住在蓝色房子旁边。
成员(Z7,X),
颜色(Z7,蓝色),
接下来(Z8,Z7,X),
民族(Z8,挪威语),
%的温斯顿烟民有蜗牛。
成员(Z9,X),
颜(Z9,温斯顿)、
宠物(Z9,蜗牛),
%抽好彩香烟的人喜欢橙汁。
成员(Z10,X)、
饮料(Z10,'橙汁'),
颜(Z10,'好运来'),
%的乌克兰人喜欢喝茶。
成员(Z11,X),
民族(Z11,乌克兰语),
饮料(Z11,茶),
%日本烟议会。
成员(Z12,X)、
民族(Z12,日语),
颜(Z12,百乐门)、
%抽库尔斯香烟的人是马主人的邻居。
成员(Z13,X)、
宠物(Z13,马),
接下来(Z14,Z13,X),
颜(Z14,库尔斯)、
%喜欢咖啡的人住在绿色的房子里。
成员(Z15,X)、
颜色(Z15,绿色),
饮料(Z15,咖啡),
%绿房子在象牙房子的右边(图中右边)。
成员(Z16,X)、
颜色(Z16,象牙色),
接下来(Z17,Z16,X),%这里我们不用右边的条件,而是假设他们是邻居。
最终答案有两个。
颜色(Z17,绿色),%这点请自行修改,当然也需要自己写一个来判断对不对。
谓词。
中间房子的人喜欢喝牛奶。
中间(Z18,X),
饮料(Z18,牛奶),
超过%就是全部条件。让我们开始回答我们的问题。
%找到宠物是斑马的房间。
成员(TT,X)、
宠物(TT,斑马),
%找出喝水的房间。
成员(TTT,X)、
喝(TTT,水)。
阅读这个程序应该没有问题。它只是把我们的术语直接翻译成
以Prolog语言为例:
%吸切斯特菲尔德香烟的人与养狐狸的人是邻居。
成员(Z5,X),
宠物(Z5,狐狸),
Next(Z6,Z5,X),%与next(Z5,Z6,X)相同。
颜(Z6,切斯特菲尔德)、
用语言描述就是:首先Z5是房子,对应member (Z5,x);然后它的宠物是狐狸。
,对应宠物(z5,狐狸);它的邻居是Z6,对应next (Z6,Z5,X);最后,Z6的人抽烟。
切斯特菲尔德斯,对应颜(Z6,切斯特菲尔德斯)。你看只要把原来的条件稍微分解一下,
,它成为我们的Prolog程序。
哈哈,这样的节目谁都能编。你看到Prolog的优势了。序言是描述性的。
语言,你只需要用Prolog语言描述一次问题,剩下的让计算机来做。
请:)。如果你用的是其他语言,比如C和Basic,你就得自己考虑程序的流程。
所以这些语言被称为过程语言。比Prolog低很多。
好,最后,让我们运行程序。
-求解(X,TT,TTT)。
X = [h(黄色,挪威人,狐狸,库尔斯,水),h(蓝色,乌克兰人,马,
切斯特菲尔德,茶),
h(红色,英国人,蜗牛,温斯顿,牛奶),h(iory,西班牙人,狗,'幸运
罢工','橙汁'),
h(绿色、日本、斑马、议会、咖啡)]
TT = h(绿色、日本色、斑马色、议会色、咖啡色)
TTT = h(黄、挪威语、福克斯、库尔斯、水);
X = [h(黄色,挪威人,狐狸,库尔斯,水),h(蓝色,乌克兰人,马,
切斯特菲尔德,茶),
h(红色,英国人,蜗牛,温斯顿,牛奶),h(绿色,日本人,斑马,
议会,咖啡),
h(象牙,西班牙人,狗,'幸运之击','橙汁')]
TT = h(绿色、日本色、斑马色、议会色、咖啡色)
TTT = h(黄色、挪威语、福克斯语、库尔斯语、水)
不
因为我们在13条件中没有使用题目中的右极限,所以有两个答案。你可以
最后看到这两个答案的两个房间,简直天翻地覆。
多花一点功夫把答案写得更漂亮,程序就完美了。