资源描述
淮海工学院计算工程学院
实验报告书
课程名: 《 人工智能》
题 目: 实验二:图搜索问题求解
班 级: D软件081
学 号: 510856106
姓 名: 汪晓骏
评语:
成绩: 指导教师:
批阅时间: 年 月 日
《人工智能》实验报告
实验二 图搜索问题求解
实验目的和要求
1、熟悉Prolog程序编写环境。
2、掌握图搜索问题求解的基本方式。
3、完成实验,并自己编写程序。
实验重点
1、 自己编写程序。
2、 掌握头搜索实现方法。
实验难点
自己编写程序。
实验环境
Windows XP prolog
实验学时
3学时,必做实验
实验内容及实验步骤:
实验内容:有一农夫带一只狼、一只羊和一筐菜欲从河的左岸乘船到右岸,但受下列条件限制:
1) 船太小,农夫每次只能带一样东西过河。
2) 如果没有农夫看管,则狼要吃羊,样要吃菜。
请设计一个国和方案,使得农夫、狼、羊、菜都能不受损失地过河。画出相应的状态空间图。
提示:
1) 用四元组(农夫、狼、羊、菜)表示状态,其中每个元素都可为0或1,用0表示在左岸,用以表示在右岸。
2) 把每次过河的一种安排作为一个算符,每次过河都必须有农夫,因为只有他可以划船。
实验步骤:
DOMAINS
LOC = east ; west /*定义河的两岸*/
STATE = state(LOC,LOC,LOC,LOC) /*定义一个状态表示河两岸的情况*/
PATH = STATE* /*状态改变的列表*/
PREDICATES
go(STATE,STATE) /* 开始状态 */
path(STATE,STATE,PATH,PATH) /* 记录过河路径 */
move(STATE,STATE) /* 移动一个对象 */
opposite(LOC,LOC) /*可能的位置 */
unsafe(STATE) /* 安全状态检查 */
member(STATE,PATH) /* 检查是否记录过此状态 */
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(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)):-opposite(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,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),
write_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(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
展开阅读全文