1、 淮海工学院计算工程学院 实验报告书 课程名: 《 人工智能》 题 目: 实验二:图搜索问题求解 班 级: D软件081 学 号: 510856106 姓 名: 汪晓骏 评语: 成绩: 指导教师:
2、 批阅时间: 年 月 日 《人工智能》实验报告 实验二 图搜索问题求解 实验目的和要求 1、熟悉Prolog程序编写环境。 2、掌握图搜索问题求解的基本方式。 3、完成实验,并自己编写程序。 实验重点 1、 自己编写程序。 2、 掌握头搜索实现方法。 实验难点 自己编写程序。 实验环境 Windows XP prolog 实验学时 3学时,必做实验 实验内容及实验步骤: 实验内容:有一农夫带一只狼、一只羊和一筐菜欲从河的左岸乘船到右岸,但受下列条件限制: 1)
3、 船太小,农夫每次只能带一样东西过河。 2) 如果没有农夫看管,则狼要吃羊,样要吃菜。 请设计一个国和方案,使得农夫、狼、羊、菜都能不受损失地过河。画出相应的状态空间图。 提示: 1) 用四元组(农夫、狼、羊、菜)表示状态,其中每个元素都可为0或1,用0表示在左岸,用以表示在右岸。 2) 把每次过河的一种安排作为一个算符,每次过河都必须有农夫,因为只有他可以划船。 实验步骤: DOMAINS LOC = east ; west /*定义河的两岸*/ STATE = state(LOC,LOC,LOC,LOC)
4、 /*定义一个状态表示河两岸的情况*/ PATH = STATE* /*状态改变的列表*/ PREDICATES go(STATE,STATE) /* 开始状态 */ path(STATE,STATE,PATH,PATH) /* 记录过河路径 */ move(STATE,STATE) /* 移动一个对象 */ opposite(LOC,LOC) /*可能的位置 */ unsafe(STATE) /* 安全状态检查 */ member(STATE,PATH) /* 检查是否记录过此
5、状态 */ write_path(PATH) write_move(STATE,STATE) GOAL write("press any key for each step of solution"), go(state(east,east,east,east),state(west,west,west,west)), write("solved press any key to continue"), readchar(_), exit. CLAUSES go(S,G):- path
6、S,G,[S],L), nl,write("A solution is:"),nl, write_path(L), fail. go(_,_). path(S,G,L,L1):- move(S,S1), not( unsafe(S1) ), not( member(S1,L) ), path( S1,G,[S1|L],L1),!. path(G,G,T,T):- !. /* 最终状态 */ move(state(X,X,G,C),state(Y,Y,G,C)):-opp
7、osite(X,Y). /* FARMER and WOLF */ move(state(X,W,X,C),state(Y,W,Y,C)):-opposite(X,Y). /* FARMER and GOAT */ move(state(X,W,G,X),state(Y,W,G,Y)):-opposite(X,Y). /* FARMER and CABBAGE */ move(state(X,W,G,C),state(Y,W,G,C)):-opposite(X,Y). /* FARMER */ opposite(east,west). opposite(west,
8、east):-!. unsafe( state(F,X,X,_) ):- opposite(F,X). /* 狼和羊不安全 */ unsafe( state(F,_,X,X) ):- opposite(F,X). /* 山羊和卷心菜不安全 */ member(X,[X|_]). member(X,[_|L]):-member(X,L). write_path( [H1,H2|T] ) :- !, readchar(_), write_move(H1,H2), wri
9、te_path([H2|T]). write_path( [] ). write_move( state(X,W,G,C), state(Y,W,G,C) ) :-!, write(" farmer crosses the river from ",X," to ",Y),nl. write_move( state(X,X,G,C), state(Y,Y,G,C) ) :-!, write(" farmer and Wolf cross rive from ",X," to ",Y),nl. write_move( state(X,W,X,C), state
10、Y,W,Y,C) ) :-!, write(" farmer and Goat cross rive from",X," to ",Y),nl. write_move( state(X,W,G,X), state(Y,W,G,Y) ) :-!, write(" farmer and cabbage cross rive from ",X," to ",Y),nl. 实验体会 通过这次实验更加加深了我对prolog使用的理解,对于代码的编写也有了更进一步的认识,虽然在这次的编写中也遇到了很多困难,但是我还是克服了,完成了代码的运行! 3






