1、第12章 Prolog语言及其程序设计121 Prolog语言简介122 PDC Prolog数据结构和基本语句1221 常量与变量1222 三种基本语句123 PDC Prolog运算符与常用内部谓词1231 函数与运算符1232 输入与输出内部谓词1233 动态数据库内部谓词124 PDC PROLOG程序结构及其说明1241 程序结构1242 常量段说明1243 域类型说明1244 谓词与动态数据库说明1245 谓词与域类型说明示例1246 对象数据类型的转换 第12章 Prolog语言及其程序设计 125 PDC Prolog的基本搜索方法 1251 搜索与回溯 1252 失败回溯循环
2、法 1253 切断回溯控制循环法 1254 自定义的循环方法 1255 递归 126 PDC Prolog的数据处理 1261 表处理技术 1262 字符串处理 1263 文件处理 第12章 Prolog语言及其程序设计 127 PDC Prolog的多媒体技术 1271 窗口的建立及使用 1272 图形模式的设置与绘图 1273 声音的内部谓词及其应用 128 PDC PROLOG语言与C语言的连接 1281 语言条件 1282 外部谓词说明 1283 参数传递 1284 外部C语言子程序 129 Visual Prolog语言 1291 Visual Prolog语言简介 1292 Vis
3、ual Prolog的可视化开发环境及其使用 121 Prolog语言简介 Prolog(Programing in Logic)的第一个系统是1972年开发的。它是一种典型的逻辑型语言,又称描述性语言。又有人把Prolog称为面向目标的语言。应用 目前己广泛应用于关系数据库、抽象问题求解、数理逻辑、符号处理、定理证明、自然语言理解、专家系统以及人工智能的许多领域。主要版本 纯Prolog、Prolog、Arity Prolog、Wisdom Prolog、Micro Prolog、PDC(Turbo)Prolog、Dec-10 Prolog、MP Prolog、PDP-11 UNIX Pro
4、log、Quintus Prolog等等。PDC(Turbo)Prolog是1986年美国Borland International公司为IBM PC及其兼容微机研制的一种编译型Prolog系统,其1.0、2.0、2.1版本取名为Turbo Prolog,其新版本3.0、3.2版本更名为PDC Prolog。现在已研制出visual Prolog。Turbo Prolog的系统界面 PDC Prolog的重要特点 1运行速度快,内存要求小,2用户界面友好。3内部谓词丰富独特 4具有强大的图形功能。支持与Turbo C和Turbo Pascal同样的图形功能。5.集成式、模块化的程序开发环境,能
5、与C、Pascal、Fortran、汇编、dBASE 等语言实现自然和谐的联结,6.程序运行时,能自动地适应模式匹配、回溯和递归。程序接近于自然语言、文法简捷、逻辑性强、易写易读、便于学习使用、易于正确性证明。Visual Prolog Visual Prolog是基于Prolog语言的可视化集成开发环境,是PDC推出的基于Windows环境的智能化编程工具,也是一个可以制作界面的Prolog,已经推出版本4.x、5.x、6.x和7.x。它的基本Prolog语句同DOS下的Turbo Prolog相似,原DOS下的Prolog原程序也很容易移植。这个prolog版本需要对谓词以及数据进行声明,
6、就像C语言一样。因此在使用的时候比较复杂,不过更加适合编制较大的程序。Visual Prolog为编译型执行,运行速度比解释型Prolog快,原程序可编译为独立执行的可执行程序,也可发布为动态连接库供VB,VC,Delphi等调用,为开发者提供更灵活的组合开发方式。Visual Prolog具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。它包含构建大型应用程序所需要的一切特性、图形开发环境、编译器、连接器和调试器,支持模块化和面向对象程序设计,支持系统级编程、文件操作、字符串处理、位级运算、算术与逻辑运算,以及与其它编程语言的接口。122 PDC Prolog数据结构和基本语
7、句 1221 常量与变量 1.常量 常量是用来命名特定对象和特定关系的一种符号,它描述的对象是已知的或具体的。包括四个方面:整数和实数 用小写字母打头的由字母、数字(0,1,9)串、“_”下划线组成的串序列;复合对象(如sdudent(“张三”)表(如1,2,3,4,5);单引号内的单个字符或双引号内的任何字符。2.变量 定义:变量是用来代表某些尚不能命名的对象。类型:整数、实数、字符、串、符号、复合对象、表和匿名变量“_”。表示:变量名是以大写字母或“_”下划线打头的字母、数字(0,1,9)串序列,中间可插有“_”下划线。用单一的下划线(_)表示匿名变量。1222 三种基本语句 1 事实 事
8、实是用来说明一个问题中已知对象和它们之间关系存在的语句。一般形式为:关系名(对象1,对象2,对象n).关系名由小写字母和“_”下划线组成,并且用小写字母打头,关系名又称为谓词。对象,对象通常是常量,但也可以是谓词。2 规则 规则可分解为表示条件的单个前提谓词和表示结论的一个或多个后件谓词组合起来的。规则的一般形式为:P:-P1,P2,PN.sister(X,Y):-female(X),parents(X,F,M),parents(Y,F,M).“/*/”之间的内容用于解释说明,IF b0 THEN x:1 ELSE x:0.用Prolog实现则是 tjfz:bO,x1.tjfz:xO.类似地,
9、对于条件多分支,可以用多条同头的规则实现。例如:tjfz:bO,x1.tjfz:bO,x0.tjfz:bO,x-1.3 目标与询问 目标分为内部目标和外部目标两种 thief(john)./*约翰是小偷*/likes(paul,food)./*保罗喜欢食品*/likes(joule,sweets)./*焦耳喜欢甜食*/likes(john,X):-likes(paul,X)./*保罗喜欢的东西约翰也喜欢*/may_steal(X,Y):-thief(X),likes(X,Y)./*如果X是贼且喜欢Y,则X可能会偷Y*/,可以这样询问:goal:may_steal(john,What)Goal:
10、likes(paul,sweets)Goal:likes(WHO,food)Goal:likes(X,Y)Goal:likes(X,_)no solutionno solutionlWHOWHOpaulpaullWHOWHOjohnjohnl2 solution2 solutionlX Xpaulpaul,Y YfoodfoodlX Xjoulejoule,Y YsweetssweetslX Xjohnjohn,Y Yfood food l3 solution3 solutionlX XpaulpaullX XjoulejoulelX Xjohnjohnl3 solution3 solutio
11、n123 PDC Prolog运算符与常用内部谓词 1.Prolog函数 Abs(X)cos(X)sin(X)tan(X)arctan(X)exp(X)ln(X)log(X)sqrt(X)2 算术运算符及其表达式、*、/、div、mod 运算的顺序为:*、/、div、mod优先于、。同级从左到右按顺序运算,括号优先。算术表达式的形式与数学中的形式基本一样。例如:数学中的算术表达式 Prolog中的算术表达式 xe+yz X*exp(X)Y*Z absin xc/d A*B*sin(X)C/D u mod v U mod V(表示求U除以V所得的余数)i div j k=i div j(i、j、
12、k均为整数)3 关系运算符及其表达式 六种常用的关系运算,即小于()、小于等于()、等于()、大于()、大于等于()和不等于()。X1Y X1Y XY XY“”的用法比较特殊,它既可以表示比较,也可以表示约束值,12.3.2 输入与输出内部谓词 1 readln(X)2 readint(X)3 readreal(X)4 readchar(X)5 write(X1,X2,Xn)例如:write(computer,Prolog,Y,1992).6.display(X)该谓词与write(X)相似,只是它忽略运算符说明,以结构形式输出项。7 Nl,n也同样可起换行作用。例如,语句write(name
13、),nl,write(age).与语句write(name,n,age).的效果完全一样。12.3.3 动态数据库内部谓词1.asserta()该内部谓词表示插一个新事实(谓词)到具有同名谓词的所有动态事实之前。例如语句:asserta(cadre(张三,处长,21,2100.70).2.assertz()该内部谓词表示插一个新事实(谓词)到具有同名谓词的所有动态事实之后。例如语句:assertz(cadre(李四,局长,25,2579.86).3.retract()该内部谓词表示从动态数据库中删除一已存在的动态事实。例如语句retract(cadre(张三,处长,21,2100.70)4.s
14、ave(DOS_file_name)该内部谓词表示把内存中整个动态数据库存入一个正文文件(在磁盘中)。5.consult(DOS_file_name)该内部谓词表示把磁盘文件DOS_file_name的内容装入内存中的动态数据库。例如:consult(dycadre.dba).124 PDC Prolog程序结构及其说明 1.程序结构/*注 释 */constants /*指定具体的常数*/domains /*说明各类对象的类型*/database /*说明用于动态数据库的自定义谓词*/predicates /*说明程序中使用的自定义谓词*/goal /*说明程序的目的*/clauses /*
15、程序的主体,由事实和规则组成*/2.域类型说明 类型名标识符取值范围 字符型char所有可能的字符 串型string字符序列(程序中最长255个字符,文件中最长64k个字符)符号型symbol 小写字母打头的字母、数字和下划线组成的序列;双引号引起来的字符序列。整型integer-3276832768 实型real1E-3071E+308 文件型file有效的DOS文件名 3.域类型说明涉及四种格式:name1,name2,nameNd 格式1:mylist1,mylist2,mylistNd*格式2:mylistelementdom*elementdomd Complex_object_do
16、mf1(d11,d12,,d1N);f2(d21,d22,,d2M);fI(DI1,dI2,,dIK).filename1;name2;nameN 4.谓词说明 predicates predname(domain1,domain2,domainN)例如 predicates predname(char、string、symbol、integer、real)。也 可 以 用 如 下 的 规 则 来 定 义 谓 词choose_teams:choose_teams:same_league(X,Y),never_played(X,Y),write(X,Y)5.谓词与域类型说明示例 collecti
17、oncollectorbooktitleauthorpublicationpublisheryear谓词谓词(主函子主函子)第第0层层函子函子 第第1层层第第2层层第第3层层图图12-2 某图书馆数据库程序的谓词结构图某图书馆数据库程序的谓词结构图 domainspersonal_librarybook(title,author,publication)publication publication(publisher,year)collector,title,author,publisher symbolyear integerpredicatescollection(collector,p
18、ersonal_library)5.谓词与域类型说明示例 domains thing misc_thing(whatever);book(author,title);record(artist,album,type)person,whatever,author,title,artist,album,type symbol predicates owns(person,thing)5.谓词与域类型说明示例 6.动态数据库说明及其使用 databasedynamic_predname(domain1,domain2,domainN)例如domainsname,headshipsymbolcadre
19、_ageintegerwagerealdatabase cadre(name,headship,cadre_age,wage)1.asserta().例如语句asserta(cadre(张三,处长,21,2100.70).cadre(张三,处长,21,2100.70).2 assertz().例如语句assertz(cadre(李四,局长,25,2579.86).cadre(张三,处长,21,2100.70).cadre(李四,局长,25,2579.86).3 retract().例如语句retract(cadre(张三,处长,21,2100.70)cadre(李四,局长,25,2579.86
20、).4 save(DOS_file_name)。例如save(dycadre.dba).5.consult(DOS_file_name):把磁盘文件DOS_file_name的内容装入内存中的动态数据库。例如:consult(dycadre.dba).6.动态数据库说明及其使用 7.对象数据类型的转换 upper_lower(S1,S2)./*S1(大写)S2(小写)*/str_int(U1,U2)./*U1(串型)U2(整型)*/str_char(V1,V2)./*V1(串型)U2(字符型)*/str_real(T1,T2)./*T1(串型)T2(实型)*/char_int(W1,W2)./
21、*W1(字符型)W2(整型)*/8.自定义对象类型的转换 conv_real_int(R,N):-R=N.conv_int_real(N,R):-N=R.conv_str_symb(S,Sy):-S=Sy.除上面的定义 predicates conv_real_int(real,integer)conv_int_real(integer,real)conv_str_symb(string,symbol)125 PDC Prolog的基本搜索方法 1251 搜索与回溯 1内部合一程序 内部合一程序其核心是一个深度为主的搜索程序,主要任务是寻求满足匹配条件的事实和规则。在收到给定目标后,合一程序从
22、上到下,从左到右搜索Prolog数据库中的事实或规则。2 搜索与回溯 对于给定的子目标,Prolog从上到下,从左到右搜索数据库寻找匹配的事实或规则。若找到了一个与目标匹配的事实,则该子目标匹配成功,其指针指向数据库中所匹配的事实,即在该位置作一个标记,并对本事实的变量进行实例化(相当于赋值)。predicates like(symbol,symbol)fruit(symbol)color(symbol,symbol)clauses like(mary,pears)./*/like(mary,popcorn)./*/like(mary,apples).like(beth,X):-like(ma
23、ry,X),fruit(X),color(X,red)./*/like(beth,X):-like(mary,X),Xpopcorn.fruit(Pears)./*/fruit(apples).color(pears,yellow).color(oranges,orange)color(apples,yellow).color(apples,red).3 回溯举例分析回溯举例分析 1252 失败回溯循环法 goal /*内部目标*/like(X,Y),write(X,“喜欢”,Y).1方法一:在规则中引入内部谓词fail(不带限制的DO循环)。fail表示失败(不成功,为假)的意思,从而引起系
24、统回溯。示例 例6-5 有以下程序。goal output clauses cadre(张三,处长,21,2100.70).cadre(李四,局长,25,2579.86).cadre(王五,科长,25,2579.86).output:-cadre(Name,Headship,_,Wage),write(Name,Headship,Wage),nl,fail.2.方法2:在规则中引入带限制匹配的事实(带限制的FOR循环)如将上述OUTPUT规则改成下列的形式:goal output clauses cadre(张三,处长,21,2100.70).cadre(李四,局长,25,2579.86).c
25、adre(王五,科长,25,2579.86).output:-cadre(Name,Headship,_,Wage),write(Name,Headship,Wage),nl,Name王五.12.5.3切断回溯控制循环法阻止回溯的内部谓词“!”(cut),称为截断谓词。“!”总是立即成功的;若“!”位于规则体内的最后,使整个规则匹配成功而告结束。若“!”位于规则右边的其他位置时,不但阻止规则体“!”后面的子句回溯,而且在指定的位置引起切断。将例6-5中的output规则修改成:goal output clauses cadre(张三,处长,21,2100.70).cadre(李四,局长,25,
26、2579.86).cadre(王五,科长,25,2579.86).output:-cadre(Name,Headship,_,Wage),write(Name,Headship,Wage),nl,make_cut(Name),!.make_cut(Name):-Name“李四”.1254自定义的循环方法 用户定义循环规则的一般形式如下:repeat.repeat:-repeat.自定义循环规则的一般形式:do_two_cycle:-repeat1,!,repeat2,!.recur./*也可使用recur1,recur2,recurn作为自定义循环谓词*/recur:-recur loop./
27、*也可使用loop1,loop2,loopn作为自定义循环谓词*/loop:-loop.iterate./*也可使用iterate1,iterate2,iteraten作为自定义循环谓词*/iterate:-iterate.1254自定义的循环方法程序示例 predicates repeat do_cycle check(real)goal do_cycle.clauses repeat.repeat:-repeat.do_cycle:-repeat,readreal(Real_number),nl,check(Real_number),!.check(0.0):-nl,write(输入完毕,
28、再见!).check(_):-fail.1255 递归 如果一个规则含有自身的成分,则该规则是递归的。递归规则在匹配的过程中规则体和规则头相同的部分反复循环地进行相互匹配,以达到多次执行某项任务的目的。但是递归调用无数次时栈将溢出,并显示错误信息,会丢掉信息。例如:display_string:-write(显示信息),nl,display_string.递归规则的一般形式可表示如下::-;.1255 递归 /*Example:求整数110之和 */domains number,sum=integer predicates seek_sum(number,sum)goal seek_sum(1
29、0,Sum),write(S(10)=,Sum),nl.clauses seek_sum(1,1):-!.seek_sum(Number,Sum):-Number0,Next_number=Number-1,sum_series(Next_number,Partial_Sum),Sum=Number+Partial_Sum.程序示例126 PDC Prolog的数据处理 1261 表处理技术图图12-3 表的二叉树表示表的二叉树表示76,84,9784,9797 768497表表头头部部分分表表尾尾部部分分1 表元素的输出 从表中取出元素并显示出来,可采用以下两条语句来实现:display_l
30、ist().display_list(Head|Tail):-write(Head),nl,display_list(Tail).现假设目标为display_list(tiger,leopard,zebra,giraffe).2 表元素的寻找 可采用以下两条语句来实现:find_element(Head,Head|_).find_element(Head,_|Tail):-find_element(Head,Tail).现假设目标为find_element(zebra,tiger,leopard,zebra,giraffe).3 将一个表分解成二个表 split(Middle,Head|Tai
31、l,Head|L1,L2):-HeadMiddle.split(_,).若目标为split(10,7,90,10,80,L1,L2)4 将两个表合并成一个表 先定义一个表合并的谓词:combine(L1,L2,L3)。其中L1、L2为两张源表,表L3初始为空表,结果为L1、L2合并后的一张表。实现的语句为:combine(,L,L).combine(N|L1,L2,N|L3):-combine(L1,L2,L3).若目标为 combine(a,b,c,d,e,L),5 表的排序 insert_sort(,).insert_sort(X|Tail,Sorted_list):-insert_sor
32、t(Tail,Sorted_Tail),insert(X,Sorted_Tail,Sorted_list).insert(X,Y|Sorted_list,Y|Sorted_list1):-asc_order(X,Y),!,insert(X,Sorted_list,Sorted_list1).insert(X,Sorted_list,X|Sorted_list).asc_order(X,Y):-XY.如果在运行时,输入外部目标:insert_sort(3,6,2,8,L),6 表的数据采集 在数据库中收集各事实的数据,可采用如下数据采集内部谓词:findall(Variable_name,Pre
33、dicates_express,List_name)其中Predicates_ express 表示输入的谓词,Variable_name表示该谓词中要采集数据的对象,采集后的数据放入表变量List_name中作为输出。程序示例 domains course=symbolpoints=integer Predicates score(course,points)data_collectiongoal data_collectionclauses score(数学,120).score(物理,110).score(化学,90).score(语文,115).score(英语,122).data_c
34、ollection:-findall(Points,score(_,Points),Point_list),write(数学、物理、化学、语文、英语的分数为:,Point_list).1262 字符串处理 字符串处理包括字符串的表示、赋值、合并、分解、查找、转换和长度计算 写单个字符时,写成N。写字符串时,写成“N1N2Nm”。predicates display_by_ascii_code goal display_by_ascii_code clauses display_by_ascii_code:-write(71,72,73),nl,write(71,“”,72,“”,73),wri
35、te(10),write(717273),write(1010),write(8068673280114111108111103).71 72 73G H IGHIPDC PrologDialog图图12-4 ASCII代码程序输出代码程序输出程序示例 2 字符串的赋值 X=PDC Prolog 或者 X=8068673280114111108111103 display_string:-S1=Beijing,S2=Shanghai,S3=Nanjing,write(S1),nl,write(S2),nl,write(S3).又如:string_evaluate(S1,S2,S3):-S1=B
36、eijing,S2=Shanghai,S3=Nanjing display_string:-string_evaluate(S1,S2,S3),write(S1),nl,write(S2),nl,write(S3).3 计算字符串长度 计算字符串长度的内部谓词如下:str_len(String_value,String_length)S=“Beijing is capital”,str_len(S,L),write(L)或写成str_len(“Beijing is capital”,L),write(L)输出184 字符串的合并 内部谓词是:concat(Input_string1,Input
37、_string2,Output_string)其中Input_string1、Input_string2是两个输入字符串,合并后的字符串Output_string。例如:concat(Artificial,Intelligence。,T),write(T).输出结果为:Artificial Intelligence。5.字符串的分解 frontstr(Number,Source_string,Substring1,Substring2).例如:a:-frontstr(22,Beijing is a beautiful city.,U1,U2),write(子串1是:,U1),write(;子串
38、2是:,U2).输出结果为:子串1是:Beijing is a beautiful;子串2是:city.6.字符串前缀字符的分离 将字符串前缀字符分离出来的内部谓词是:frontchar(Unite_string,Prefix_char,Rest_of_string).front(Str1,A,BCDEF).,Str1被约束为BCDEF;frontchar(Nanjing,N,Str2).,Str2被约束为Nanjing;frontchar($asdfghjk,Str3,Str4).,Str3被约束为$,Str4被约束为asdfghjk。利用frontchar容易将字符串转化成字符表:conv
39、er(,).conver(Str,Head|Tail):-frontchar(Str,Head,Str1),conver(Str1,Tail).其中Conver是自定义谓词。当目标是conver(Nanjing,L)时 使得L=N,a,n,j,i,n,g。6.字符串前缀字符的分离7 字符串词法符号的分离 在一个字符串中分离出第一个词法符号,可采用如下的内部谓词:fronttoken(Unite_string,Prefix_token,Rest_of_string)fronttoken(Str1,Beijing,is a great city).fronttoken(Nanjing,Token1
40、,Rest1)fronttoken($Shanghai,Token2,Rest2).fronttoken(PDC_A23b,Token3,Rest3).convers(,).convers(Str,Head|Tail):-fronttoken(Str,Head,Str1),convers(Str1,Tail).当目标是convers(“Beijing is a great city”,L)时,输出结果L的值为Beijing,is,a,great,city。7 字符串词法符号的分离 1263 文件处理 1 输入输出设备之间读和写的含义内存、处内存、处理器、操理器、操作系统作系统显示器显示器FIL
41、E1.DATFILE2.DATFILEn.DAT打印机打印机COM1图图12-5 输入输出设备间的读写关系输入输出设备间的读写关系读读读读读读读读读读写写写写写写写写写写写写键盘键盘2 默认读写设备的内部谓词 改变默认输入(读)设备的内部谓词是:readdevice(Device_file_name1).其中Device_file_name (keyboard)、(COM1、COM2)、(如FILE.DAT)。例如readdevice(myfile),是把默认输入设备转向myfile;再如readdevice(COM2),指定从COM2输入数据。改变默认输出(写)设备的内部谓词是:writed
42、evice(Device_file_name2).其中Device_file_name2 可以是(screen)、打印机(printer)、通信端口(COM1、COM2)、文件(如FILE.DAT)。示例 a:-write(中国是个伟大的国家),nl,writedevice(printer),write(北京人热情好客),nl,writedevice(screen),write(南京人欢迎您).3 磁盘文件管理内部谓词 deletefile(DOS_filename).save(DOS_filename).renamefile(Old-_DOS_filename,New_DOS_filenam
43、e).existfile(DOS_filename).flush(Device_file_name).disk(Path).dir(Pathname,File_spec_string,Dos_filename).4 写数据到文件 写数据到文件的一般格式为:openwrite(datafile,FILE.DAT),writedevice(datafile),/*这里每一个write都将数据写入到FILE.DAT中*/Closefile(datafile).程序示例 domains file=datafilepredicates student_score(string)write_rulegoa
44、l openwrite(datafile,EXAMSCO.DAT),write_rule,closefile(datafile).clauses student_score(张三数学成绩92分).student_score(李四数学成绩76分).student_score(王五数学成绩87分).write_rule:-student_score(S),write(,S),nl,writedevice(datafile),write(,S),nl,writedevice(screen),fail.write_rule.5 从文件中读出数据 openread(datafile,FILE.DAT),
45、readdevice(datafile),Closefile(datafile).goal openread(datafile,EXAMSCO.DAT),read_rule,closefile(datafile).clausesread_rule:-readdevice(datafile),not(eof(datafile),readln(S),writedevice(screen),write(,S),nl,read_rule.read_rule.程序示例 改变指针的位置的内部谓词 filepos(Domain_filename,File_position,Mode).其中Domain_fi
46、lename是域说明文件,File_position是整型,指明指针所对应字符的位置,Mode的取值为0、1、2:Mode=0时,文件位置相对于文件的开始处;Mode=1时,文件位置相对于当前的位置;Mode=2时,文件位置相对于文件的末尾处。如filepos(datafile,200,0),指针指向第200个字符。又如filepos(datafile,200,1),表示指针从当前位置开始,指针指向向后移动200个字符的位置。6 修改文件中的数据 openmodify(datafile,FILE.DAT),writedevice(datafile),Closefile(datafile).7在
47、文件中扩充数据 openappend(datafile,FILE.DAT),writedevice(datafile),Closefile(datafile).12.7 PDC Prolog的多媒体技术 1271 窗口的建立及使用 1 创建窗口的内部谓词 makewindow(Window_number,Screen_attribute,Frame_attribute,Window_title,Starting_row,Starting_column,Window_height,Window_width).Screen_attribute前景属性值背景属性值 2 其它窗口内部谓词 shiftw
48、indow(window_number).gotowindow(window_number).清除窗口内容的内部谓词clearwindow 清除当前窗口内部谓词removewindow cursor(Row_number,Column_number)3 利用窗口进行程序设计建单个窗口指定光标位置写正文到窗口转移窗口写入新正文删去窗口或正文例6-7 试建立干部动态数据库。do_mbasemenuprocess(1)process(2)process(3)process(4)assert_databaseclear_databaseChoice=1 添加数据添加数据=2 删除数据删除数据=3 显示
49、数据显示数据=4 退出程序退出程序图图12-6 基于内存的干部数据库结构基于内存的干部数据库结构插入数据库插入数据库清除数据库清除数据库12.7.2图形模式的设置与绘图 1 设置图形模式 graphics(Mode,Palette,Color)2 画直线和点的内部谓词 画直线的内部谓词具有以下结构:line(Row_1,Column_1,Row_2,Column_2,Palette_color)画点的内部谓词的结构为:dot(Row,Column,Palette_color)点(31999,31999)位于屏幕右下角。画一个具体的三角形的规则 draw_triangle:-graphics(3
50、,0,8),line(12000,12000,12000,20000,1),line(12000,20000,4000,18000,1),line(4000,18000,12000,12000,1).画圆的计算 图图12-7 圆周与半径和圆心之间的数学关系圆周与半径和圆心之间的数学关系(Row_r,Column_r)(Center_row,Center_col)XR draw_round(X):-X=6.28,!.draw_round(X):-Center_row=20000,Center_col=5000,R=3600,Row_r=Center_row-R*cos(X),Column_r=C