1、何训松prolog天津农学院计算机科学与信息工程系Prolog语言教学实习报告实习名称: Prolog程序的设计与开发 专业班级: 09级软件工程2班 学 号: 0908054223 姓 名: 何训松 指导教师: 马国强 成 绩: 2012年8月目 录1 实习内容 12 实习目的 13 实习设计介绍 13.1 设计名称 13.2 设计目标 13.3 地图填色问题 13.4 画一棵树 54 总结与体会 81 实习内容解决地图填色问题、用Prolog程序画出一棵树,通过实验进行验证并上机调试运行,写出实习报告。2 实习目的加深对prolog软件的使用与应用,并熟悉prolog语言,将某些问题用pr
2、olog程序得以实现,体会该程序的独特之处。对所学专业知识进一步消化、理解并系统化,锻炼和提高综合运用所学知识解决实际问题的能力。3 实习设计介绍3.1 设计名称Prolog程序的设计与开发3.2 设计目标书写代码并运行程序得出预期结果。3.3 地图填色问题3.3.1 概述这个地图着色问题,是一个著名的数学难题。大家不妨用一张中国政区图来试一试,无论从哪里开始着色,至少都要用上四种颜色,才能把所有省份都区别开来。所以,很早的时候就有数学家猜想:任何地图的着色,只需四种颜色就足够了。这就是四色问题这个名称的由来。人人都熟悉地图,可是绘制一张普通的政区图,至少需要几种颜色,才能把相邻的政区或区域通
3、过不同的颜色区分开来,就未必是一个简单的问题了。3.3.2 实验步骤 1.创建一个console控制台程序 2.建立之后,Bulid/Bulid一下 3.修改main.pro 3.3.3 Prolog代码implement main open core,stdiodomains colors=bule;yellow;red;green. neighbors=nb(colors,colors). map=neighbors*.class predicates aMap:(map) nondeterm anyFlow. test:(map) procedure anyFlow. generateC
4、olor:(colors) multi(o).clausesclassInfo(main,fourcolors).generateColor(R):- R=bule; R=yellow; R=green; R=red;aMap().aMap(X|Xs):- X=nb(C1,C2), not(C1=C2), aMap(Xs).class facts n:integer:=0clausestest(L):- n:=0 generateColor(A), generateColor(B), generateColor(C), generateColor(D), generateColor(E), g
5、enerateColor(F), L=nb(A,B),nb(A,C),nb(A,E),nb(A,F), nb(B,C),nb(B,D),nb(B,E),nb(B,F), nb(C,D),nb(C,F),nb(C,F). n:=n+1, aMap(L) ,! ;L=. run():- console:init(), test(L), stdio:write(n,n,n,L), _=stdio:readline().end implement maingoalmain Exe:run(main:run).3.3.4 运行结果3.3.5 变种问题我们可以修改程序,看看到底有多少种填色方案。修改程序后
6、代码如下implement main open core,stdiodomains colors=blue;yellow;red;green. neighbors=nb(colors,colors). map=neighbors*.class predicates aMap:(map) nondeterm anyFlow. test:(map) nondeterm anyFlow.% multi anyFlow. %procedure anyFlow. generateColor:(colors) multi(o).clausesclassInfo(main,fourcolors).gener
7、ateColor(R):- R=blue; R=yellow; R=green; R=red.aMap().aMap(X|Xs):- X=nb(C1,C2), not(C1=C2), aMap(Xs).class facts n :integer :=0. k :integer :=0.clausestest(L):- n:=0, generateColor(A), generateColor(B), generateColor(C), generateColor(D), generateColor(E), generateColor(F), L=nb(A,B),nb(A,C),nb(A,E)
8、,nb(A,F), nb(B,C),nb(B,D),nb(B,E),nb(B,F), nb(C,D),nb(C,F),nb(C,F), %write(n,), n:=n+1, aMap(L). % ,! %;L=. run():- console:init(), k:=0, test(L), k:=k+1, N=string:format(%2 -%3 ,k, n), stdio:write(nn,N,n,L),%),stdio:nl, n:=0, fail. run():- _=stdio:readline().end implement maingoalmainExe:run(main:r
9、un).运行截图3.4 画一棵树3.4.1 概述本程序画树的形态是步长4.0,倾角0.1745329,向上画一段,然后画一个分支,再向上画一段,另外一个方向画分支,改变方向,画一段。3.4.2 实验步骤1.创建一个GUI Project Lsys2.再其根目录下创建包 aristid3.在aristid下创建Form “Canvas”,另外创建一个class“draw”,并不选择:Create Objects”。使File/New可用,用 Code Expert添加代码在taskWindow.pro4.在draw.cl draw.pro 添加代码5.先Build/Build 然后编辑canva
10、s.frm,在Events对话框中添加onPaint为paintResponder的事件处理谓词,双击后在canvas.pro里添加代码。6.运行程序3.4.3 Prolog代码taskWindow.propredicates onFileNew:window:menuItemListener. clauses onFileNew(S,_MenuTag):- X=canvas:new(S),X :show().draw.clclass draw open core,vpiDomains predicates classInfo:core:classInfo. tree:(windowHandl
11、e). end class drawdraw.proimplement draw open core,vpiDomains,vpi,mathclauses classInfo(plotter/draw,1.0).domains command=t(commandList);f(integer); r(integer);m. commandList=command*. class facts pos:(real Delta,real Turn)single. grammar:(commandList) single. class predicates move:(windowHandle,pnt
12、,real,commandList) procedure(i,i,i,i). derive:(commandList,commandList) procedure(i,o). mv:(windowHandle,pnt,real,command,pnt,real) procedure(i,i,i,i,o,o). iter:(integer,commandList,commandList) procedure(i,i,o). clauses pos(4.0,0.1745329). grammar(f(1). iter(0,S,S):-!. iter(I,InTree,OutTree):- deri
13、ve(InTree,S), iter(I-1,S,OutTree). derive (,):-!. derive(f(0)|Rest,f(0),f(0)|S):-!, derive(Rest,S). derive(f(_)|Rest, f(0),t(r(1),f(1),f(0), t(r(-1),f(1),r(1),f(1)|S):-!, derive(Rest,S). derive(t(Branches)|Rest,t(B)|S):-!, derive(Branches,B), derive(Rest,S). derive(X|Rest,X|S):-derive(Rest,S). mv(Wi
14、n,P1,Facing,f(_),P2,Facing):-!, pos(Displacement,_Turn), P1=pnt(X1,Y1), X2=round(X1+Displacement*cos(Facing), Y2=round(Y1+Displacement*sin(Facing), P2=pnt(X2,Y2), drawline(Win,P1,P2). mv(_Win,P1,Facing,m,P2,Facing):-!, pos(Displacement,_Turn), P1=pnt(X1,Y1), X2=round(X1+Displacement*cos(Facing), Y2=
15、round(Y1+Displacement*sin(Facing), P2=pnt(X2,Y2). mv(_Win,P1,Facing,r(Direction),P1,F):-!, pos(_Displacement,Turn), F=Facing+Direction*Turn. mv(Win,P1,Facing,t(B),P1,Facing):- move(Win,P1,Facing,B). move(_Win,_P1,_Facing,):-!. move(Win,P1,Facing,X|Rest):- mv(Win,P1,Facing,X,P,F), move(Win,P,F,Rest).
16、 tree(Win):- grammar(Commands), iter(5,Commands,C), Facing=-pi/2, Point=pnt(100,250), move(Win,Point,Facing,C). end implement drawcanvas.propredicates onPaint:drawWindow:paintResponder. clauses onPaint(S,_Rectangle,_GDIObject):- draw:tree(S:getVPIWindow(). 3.4.4 结果截图4 总结与体会通过本次开发实践,加深了对prolog程序编程的熟练程度,对prolog语言有了深一步的了解。对所学专业知识进一步消化、理解并系统化,锻炼和提高综合运用所学知识解决实际问题的能力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1