4

如果我有以下谓词door,它声明两个房间之间有一扇门:

door(office, hall).
door(kitchen, office).
door(hall, "dining room").
door(kitchen, cellar).
door("dining room", kitchen).

以及声明门状态的谓词doorstate :

doorstate(hall, office, closed).
doorstate(hall, "dining room", opened).
doorstate("dining room", kitchen, opened).
doorstate(kitchen, office, opened).
doorstate(kitchen, cellar, opened).

如果两个房间之间的所有门都打开,则两个房间之间有一条通道。

我如何编写规则来发现两个房间之间是否有这样的路径?

4

4 回答 4

5

序言的可怕恐怖回来得太快了。

wayopen(Room1,Room2) :- doorstate(Room1, Room2, opened).
wayopen(Room1,Room2) :- doorstate(Room1, RoomX, opened), wayopen(RoomX,Room2).

所以我不只是为你做功课,这里是如何理解它:

  • 如果两个房间由一扇门连接并且门是打开的,则在两个房间之间的道路是开放的。
  • 如果第一种方式有一扇通往另一个房间的门,并且有一条从另一个房间到第二个房间的路,那么这条路在两个房间之间是开放的。

请注意,这些规则只能通过一个方向的门。你的功课是让它双向工作。

我们可以从大厅到哪里去?

?- wayopen(hall, X).
X = diningroom ;
X = kitchen ;
X = office ;
X = cellar ;
false.

以下是您可以往返的所有房间:

?- wayopen(Room1,Room2).
Room1 = hall,
Room2 = diningroom ;
Room1 = diningroom,
Room2 = kitchen ;
Room1 = kitchen,
Room2 = office ;
Room1 = kitchen,
Room2 = cellar ;
Room1 = hall,
Room2 = kitchen ;
Room1 = hall,
Room2 = office ;
Room1 = hall,
Room2 = cellar ;
Room1 = diningroom,
Room2 = office ;
Room1 = diningroom,
Room2 = cellar ;
false.
于 2009-03-25T00:58:46.283 回答
1

您需要描述一个exists_way/2对称且可传递的关系 ( )。

% Base cases
exists_way_(hall, 'dining room').
exists_way_('dining room', kitchen).
exists_way_(kitchen, office).
exists_way_(kitchen, cellar).

% Symmetric
exists_way(R1, R2) :- exists_way_(R1, R2) ; exists_way_(R2, R1).

% Transitive
exists_way(R1, R2) :-
    exists_way_(R1, R3),
    exists_way(R3, R2).

但是,此代码会过度生成解决方案。因此,您需要稍后过滤掉重复项。

于 2009-03-25T18:03:41.937 回答
1

您需要描述一个exists_way/2对称且可传递的关系 ( )。在支持表格的 Prolog(例如XSB)中,您可以以非常自然的方式表达这些关系,即就像它们在数学书籍中表达的那样。

:- table exists_way/2.

% Open doors
exists_way(hall, 'dining room').
exists_way('dining room', kitchen).
exists_way(kitchen, office).
exists_way(kitchen, cellar).

% Symmetry
exists_way(R1, R2) :-
    exists_way(R2, R1).

% Transitivity
exists_way(R1, R2) :-
    exists_way(R1, R3),
    exists_way(R3, R2).

在这种情况下,查询exists_way(R1, R2)提供了 25 个独特的解决方案。

于 2009-04-11T20:42:25.270 回答
-1

本着学习的精神:这与您在序言课程的第一周可能遇到的祖父母问题相同。

事实证明,你将在 prolog 中做的很多事情在结构上都非常相似。因此,请确保您掌握有关递归谓词的概念,以及子句必须如何进行的顺序,以便更正和执行。

例如,您应该尽可能避免非尾递归。

于 2009-04-20T11:26:29.270 回答