2011-06-30 52 views
1

我在房间门定义列表:Visual Prolog中 - 迷宫问题

class facts 
door : (string Room1, string Room2). 
skarb : (string Skarb, string Room). 

class predicates 
go : (string Room1, string Room2, string* R_list) nondeterm anyflow. 
is_Member : (string Room, string* R_list) nondeterm . 
write_list : (string* R_list) nondeterm . 
    clauses 
door("a", "b"). 
door("b", "e"). 
door("b", "c"). 
door("d", "e"). 
door("c", "d"). 
door("e", "f"). 
door("g", "e"). 
door("g", "a"). 
door("h", "b"). 
door("h", "a"). 
door("h", "f"). 
door("i", "b"). 
door("i", "h"). 
door("i", "c"). 
door("i", "k"). 
skarb("bomba", "d"). 

还有一些谓词:

go(Room, Room, R_list) :- stdio::write("\n\nJest droga:"), write_list(R_list), !. 
go(Room1, Room2, R_list) :- door(Room1, X), not(is_Member(X, R_list)), go(X, Room2, [X | R_list]). 

go(Room1, Room2, R_list) :- door(X, Room1), not(is_Member(X, R_list)), go(Room2, X, [X | R_list]). 

is_Member(Room, [Room | _]) :- !. is_Member(Room, [_ | Tail]) :- is_Member(Room, Tail). 

write_list([]) :- !. 
write_list([Head | Tail]) :- stdio::write(Head), write_list(Tail). 

我期待从房间到另一个房间的方式:

run():- 
stdio::write("\nDroga z a do f"), 
R_list=["a"], 
go("a", "f", R_list), 
fail. 

该断言工作并返回:

玩笑的Droga:FEBA

玩笑的Droga:FEDCBA

哪个房间的名单,我必须从通过到f。 run(): - stdio :: write(“\ nDroga z f do a”), R_list = [“f”], go(“f”,“a”,R_list), 失败。 但是这个,没有任何回报。而且你可能会注意到这与前一种情况相反。

回答

1

这个问题闻起来很像家庭作业。你应该适当地标记它。

door(A, B)这里是从A定向边缘B door(A, B)在你的定义并不意味着也door(B, A)

事实上,F不会导致任何其他房间。这是一个死路,或多或少。

声明:我不确定是否有比我建议的方式更好的方法。 此外,我不确定path是否正确书写,因为我现在无法对其进行测试。

你可以建立一个新的规则,像这样:

reversible_door(A,B):- door(A,B). 
reversible_door(A,B):- door(B,A). 

但是你还是要注意周期。您可以通过跟踪访问的房间来避免周期。

path(A,B,_):- reversible_door(A,B). 
path(A,B,Nodes):- reversible_door(A,X), 
        not(member(X,Nodes)), 
        path(X,B,[A|Nodes]). 

当然,这也被假设没有自我的边缘,像door(A, A).如果这已经暗示,太好了。但是如果你愿意的话,你也可以检查一下。

这是没有直接关系的问题,但你可以检查一个房间有一个“邦巴”与not(skarb("bomba",A))