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条件中没有使用题目中的右极限,所以有两个答案。你可以

最后看到这两个答案的两个房间,简直天翻地覆。

多花一点功夫把答案写得更漂亮,程序就完美了。