




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 失败回溯循环法12
2、53 切断回溯控制循环法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 Visual Prolog的可视化开发环境及其使用
3、 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 Prolog、Quintus Prolog等等。
4、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. 集成式、模块化的程序开发环境,能与C、Pascal、Fortran、汇编
5、、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版本需要对谓词以及数据进行声明,就像C语言一样。因此在使用的时候比较复
6、杂,不过更加适合编制较大的程序。Visual Prolog为编译型执行,运行速度比解释型Prolog快,原程序可编译为独立执行的可执行程序,也可发布为动态连接库供VB,VC,Delphi等调用,为开发者提供更灵活的组合开发方式。 Visual Prolog具有模式匹配、递归、回溯、对象机制、事实数据库和谓词库等强大功能。它包含构建大型应用程序所需要的一切特性、图形开发环境、编译器、连接器和调试器,支持模块化和面向对象程序设计,支持系统级编程、文件操作、字符串处理、位级运算、算术与逻辑运算,以及与其它编程语言的接口。122 PDC Prolog数据结构和基本语句 1221 常量与变量 1. 常量
7、常量是用来命名特定对象和特定关系的一种符号,它描述的对象是已知的或具体的。包括四个方面: 整数和实数用小写字母打头的由字母、数字(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
10、(john,What) Goal:likes(paul,sweets)Goal:likes(WHO,food) Goal:likes(X,Y)Goal:likes(X,_ )no solutionWHOpaulWHOjohn2 solutionXpaul,YfoodXjoule,YsweetsXjohn,Yfood 3 solutionXpaulXjouleXjohn3 solution123 PDC Prolog运算符与常用内部谓词 1. Prolog函数Abs(X)cos(X)sin(X)tan(X)arctan(X)exp(X)ln(X)log(X)sqrt(X)2 算术运算符及其表达式
11、、*、/、div、mod运算的顺序为:*、/、div、mod优先于、。同级从左到右按顺序运算,括号优先。算术表达式的形式与数学中的形式基本一样。例如:数学中的算术表达式 Prolog中的算术表达式 xex+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、k均为整数) 3 关系运算符及其表达式六种常用的关系运算,即小于()、小于等于()、等于()、大于()、大于等于()和不等于()。 X1Y X1Y XY XY“”的用法比较特殊,它既可以表示比较,也可以表示约束
12、值,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),nl,write(age).与语句write(name,n,age).的效果完全一样。12.3.3 动态数据库内部谓词1. asserta()该内部谓词表示插一个新事实(谓词)到具有同名谓词的所有动态事
13、实之前。例如语句:asserta(cadre(张三,处长,21,2100.70).2. assertz()该内部谓词表示插一个新事实(谓词)到具有同名谓词的所有动态事实之后。例如语句:assertz(cadre(李四,局长,25,2579.86).3. retract()该内部谓词表示从动态数据库中删除一已存在的动态事实。例如语句retract(cadre(张三,处长,21,2100.70)4. save(DOS_file_name)该内部谓词表示把内存中整个动态数据库存入一个正文文件(在磁盘中)。5. consult(DOS_file_name)该内部谓词表示把磁盘文件DOS_file_na
14、me的内容装入内存中的动态数据库。例如: consult(dycadre.dba).124 PDC Prolog程序结构及其说明 1. 程序结构/* 注 释 */constants /* 指定具体的常数 */ domains /* 说明各类对象的类型 */ database /* 说明用于动态数据库的自定义谓词 */ predicates /* 说明程序中使用的自定义谓词 */ goal /* 说明程序的目的*/ clauses /* 程序的主体,由事实和规则组成 */ 2. 域类型说明 类型名标识符取值范围 字符型char所有可能的字符 串型string字符序列(程序中最长255个字符,文件
15、中最长64k个字符) 符号型symbol 小写字母打头的字母、数字和下划线组成的序列;双引号引起来的字符序列。 整型integer-3276832768 实型real1E-3071E+308 文件型file有效的DOS文件名 3.域类型说明涉及四种格式: name1,name2,nameNd 格式1:mylist1,mylist2,mylistNd* 格式2:mylistelementdom* elementdomd Complex_object_domf1(d11,d12,,d1N); f2(d21,d22,,d2M); ; fI(DI1,dI2,,dIK). filename1;name2
16、;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. 谓词与域类型说明示例 collectioncollectorbooktitleauthorpublicationpublisheryear谓词(主函子) 第0层函子 第1层第2层第3层图12-
17、2 某图书馆数据库程序的谓词结构图 domainspersonal_librarybook(title,author,publication)publication publication(publisher,year)collector,title,author,publisher symbolyear integerpredicatescollection(collector,personal_library) 5. 谓词与域类型说明示例 domains thing misc_thing(whatever) ; book(author,title) ; record(artist,albu
18、m,type) person,whatever,author, title,artist,album,type symbolpredicates owns(person,thing) 5. 谓词与域类型说明示例 6. 动态数据库说明及其使用 databasedynamic_predname(domain1,domain2,domainN) 例如domainsname,headshipsymbolcadre_ageintegerwagerealdatabase cadre(name,headship,cadre_age,wage) 1. asserta() . 例如语句asserta(cadre
19、(张三,处长,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).4 save(DOS_file_name) 。例如save(dycadre.dba).5. consult(DOS_file_name):把磁盘文件DOS_file_name
20、的内容装入内存中的动态数据库。例如: 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). /* W1(字符型)W2(整型) */ 8. 自定义对象类型的转换 conv_real_int(R,N) :- R = N. conv_int
21、_real(N,R) :- N = R. conv_str_symb(S,Sy) :- S = Sy. 除上面的定义predicatesconv_real_int(real,integer)conv_int_real(integer,real)conv_str_symb(string,symbol) 125 PDC Prolog的基本搜索方法 1251 搜索与回溯 1内部合一程序 内部合一程序其核心是一个深度为主的搜索程序,主要任务是寻求满足匹配条件的事实和规则。在收到给定目标后,合一程序从上到下,从左到右搜索Prolog数据库中的事实或规则。 2 搜索与回溯对于给定的子目标,Prolog从上
22、到下,从左到右搜索数据库寻找匹配的事实或规则。若找到了一个与目标匹配的事实,则该子目标匹配成功,其指针指向数据库中所匹配的事实,即在该位置作一个标记,并对本事实的变量进行实例化(相当于赋值)。predicates like(symbol,symbol) fruit(symbol) color(symbol,symbol)clauses like(mary,pears)./*/ like(mary,popcorn)./*/ like(mary,apples). like(beth,X):- like(mary,X),fruit(X),color(X, red)./*/ like(beth,X):
23、- 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表示失败(不成功,为假)的意思,从而引起系统回溯。示例例6-5 有以下程序。goaloutputclausescadre(张三,
24、处长,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规则改成下列的形式:goaloutputclausescadre(张三,处长,21,2100.70).cadre(李四,局长,25,2579.86).cadre(王五,科长,25,2579.86).output :- cadre(Name
25、,Headship,_ ,Wage),write(Name,Headship,Wage),nl, Name王五.12.5.3切断回溯控制循环法阻止回溯的内部谓词“!”(cut),称为截断谓词。 “!” 总是立即成功的;若“!”位于规则体内的最后,使整个规则匹配成功而告结束。若“!”位于规则右边的其他位置时,不但阻止规则体“!”后面的子句回溯,而且在指定的位置引起切断。将例6-5中的output规则修改成: goaloutputclausescadre(张三,处长,21,2100.70).cadre(李四,局长,25,2579.86).cadre(王五,科长,25,2579.86). outpu
26、t :- 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 :- recurloop. /*也可使用loop1,loop2,loop
27、n作为自定义循环谓词*/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 = integerpredicates seek_sum(number,sum)goa
29、l seek_sum(10,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 表元素的输出从表中取出元素并显示出来,可采用以下两条语句来实现:
30、display_list( ). 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
31、(Middle,Head|Tail,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_sor
32、t(X|Tail,Sorted_list):- insert_sort(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 表的数据采集 在数据库中收集各事
33、实的数据,可采用如下数据采集内部谓词: findall(Variable_name,Predicates_express, List_name) 其中Predicates_ express 表示输入的谓词,Variable_name表示该谓词中要采集数据的对象,采集后的数据放入表变量List_name中作为输出。 程序示例 domains course = symbolpoints = integer Predicates score(course,points) data_collectiongoal data_collectionclauses score(数学,120). score(物
34、理,110). score(化学,90). score(语文,115). score(英语,122). data_collection :- findall(Points,score(_,Points),Point_list), write(数学、物理、化学、语文、英语的分数为:,Point_list). 1262 字符串处理 字符串处理包括字符串的表示、赋值、合并、分解、查找、转换和长度计算 写单个字符时,写成N。 写字符串时,写成“N1N2Nm”。 predicates display_by_ascii_codegoaldisplay_by_ascii_code clausesdispla
35、y_by_ascii_code:- write(71, ,72, ,73), nl,write(71,“ ”,72,“ ”,73), write(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 =
36、 Nanjing ,write(S1), nl,write(S2),nl,write(S3).又如: string_evaluate(S1,S2,S3):- S1 = Beijing, 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
37、),write(L)或写成str_len(“Beijing is capital”,L),write(L)输出184 字符串的合并内部谓词是: concat(Input_string1,Input_string2,Output_string) 其中Input_string1、Input_string2是两个输入字符串,合并后的字符串Output_string。例如:concat(Artificial, Intelligence。,T), write(T).输出结果为: Artificial Intelligence。5. 字符串的分解 frontstr(Number,Source_string
38、,Substring1,Substring2).例如: a :- frontstr(22,Beijing is a beautiful city.,U1,U2),write(子串1是:,U1), write(;子串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,
39、N,Str2).,Str2被约束为Nanjing;frontchar($asdfghjk,Str3,Str4).,Str3被约束为$,Str4被约束为asdfghjk。 利用frontchar容易将字符串转化成字符表:conver(, ). 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 字符串词法符号的分离 在一个字符串中分离出第一个词法符号,可采用如下的内部谓
40、词: fronttoken(Unite_string,Prefix_token,Rest_of_string) fronttoken(Str1,Beijing, is a great city). fronttoken(Nanjing,Token1,Rest1) fronttoken($Shanghai,Token2,Rest2). fronttoken(PDC_A23b,Token3,Rest3). convers(, ). convers(Str,Head|Tail):- fronttoken(Str,Head,Str1),convers(Str1,Tail).当目标是convers(“B
41、eijing is a great city”,L)时, 输出结果L的值为Beijing,is,a,great,city。 7 字符串词法符号的分离 1263 文件处理 1 输入输出设备之间读和写的含义内存、处理器、操作系统显示器FILE1.DATFILE2.DATFILEn.DAT打印机COM1图12-5 输入输出设备间的读写关系读读读读读写写写写写写键盘2 默认读写设备的内部谓词 改变默认输入(读)设备的内部谓词是: readdevice(Device_file_name1). 其中Device_file_name (keyboard)、(COM1、COM2)、(如FILE.DAT)。 例
42、如readdevice(myfile),是把默认输入设备转向myfile;再如readdevice(COM2),指定从COM2输入数据。 改变默认输出(写)设备的内部谓词是: writedevice(Device_file_name2). 其中Device_file_name2 可以是(screen)、打印机(printer)、通信端口(COM1、COM2)、文件(如FILE.DAT)。 示例 a :- write(中国是个伟大的国家),nl, writedevice(printer), write(北京人热情好客),nl, writedevice(screen), write(南京人欢迎您)
43、.3 磁盘文件管理内部谓词 deletefile(DOS_filename).save(DOS_filename).renamefile(Old_DOS_filename,New_DOS_filename).existfile(DOS_filename).flush(Device_file_name).disk(Path).dir(Pathname,File_spec_string,Dos_filename). 4 写数据到文件写数据到文件的一般格式为:openwrite(datafile,FILE.DAT), writedevice(datafile), /*这里每一个write都将数据写入
44、到FILE.DAT中*/ Closefile(datafile).程序示例 domains file = datafilepredicates student_score(string) write_rulegoal 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
45、),nl, writedevice(datafile), write( ,S),nl,writedevice(screen),fail. write_rule. 5 从文件中读出数据 openread(datafile,FILE.DAT), readdevice(datafile), Closefile(datafile).goal openread(datafile, EXAMSCO.DAT), read_rule, closefile(datafile).clausesread_rule :- readdevice(datafile),not(eof(datafile), readln(S
46、), writedevice(screen), write( ,S),nl,read_rule.read_rule. 程序示例 改变指针的位置的内部谓词 filepos(Domain_filename,File_position,Mode). 其中Domain_filename是域说明文件, File_position是整型,指明指针所对应字符的位置, Mode的取值为0、1、2:Mode=0时,文件位置相对于文件的开始处;Mode=1时,文件位置相对于当前的位置;Mode=2时,文件位置相对于文件的末尾处。如filepos(datafile,200,0),指针指向第200个字符。又如file
47、pos(datafile,200,1),表示指针从当前位置开始,指针指向向后移动200个字符的位置。 6 修改文件中的数据openmodify(datafile,FILE.DAT), writedevice(datafile), Closefile(datafile). 7在文件中扩充数据openappend(datafile,FILE.DAT), writedevice(datafile), Closefile(datafile). 12.7 PDC Prolog的多媒体技术1271 窗口的建立及使用1 创建窗口的内部谓词makewindow(Window_number,Screen_att
48、ribute,Frame_attribute,Window_title,Starting_row, Starting_column,Window_height,Window_width).Screen_attribute前景属性值背景属性值 2 其它窗口内部谓词 shiftwindow(window_number). gotowindow(window_number). 清除窗口内容的内部谓词clearwindow清除当前窗口内部谓词removewindow cursor(Row_number, Column_number)3 利用窗口进行程序设计建单个窗口指定光标位置写正文到窗口转移窗口写入
49、新正文删去窗口或正文例6-7 试建立干部动态数据库。 do_mbasemenuprocess(1)process(2)process(3)process(4)assert_databaseclear_databaseChoice=1 添加数据 =2 删除数据 =3 显示数据 =4 退出程序图12-6 基于内存的干部数据库结构插入数据库清除数据库12.7.2图形模式的设置与绘图1 设置图形模式 graphics(Mode,Palette ,Color)2 画直线和点的内部谓词画直线的内部谓词具有以下结构: line(Row_1,Column_1,Row_2,Column_2,Palette_co
50、lor) 画点的内部谓词的结构为: dot(Row,Column,Palette_color) 点(31999,31999)位于屏幕右下角。 画一个具体的三角形的规则draw_triangle :- graphics(3,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)XRdraw_round(X) :-
51、X = 6.28, !.draw_round(X) :- Center_row = 20000, Center_col = 5000, R = 3600,Row_r = Center_row - R * cos(X),Column_r = Center_col + R * sin(X), real_int(Row_r,Row),real_int(Column_r,Column),dot(Row,Column,1), X1 = X + 0.02,draw_round(X1).real_int(R,I) :- R = I.画圆的程序设计3 海龟绘图 penup:提起笔,用于移动海龟而不作图。pen
52、down:放下笔,作好画图的准备。pencolor(Color_number):由表12-8选轨迹颜色。forword(Step_size):Step_size的取值范围为131999。back(Step_size):移到屏外不可见,也不出错。left(Angle):Angle的单位为度,如left(60)是向左转60度。right(Angle):向右转Angle度。penpos(Row,Column,Angle): (Row,Column)的取值范围是(0,0)(31999,31999),方位角缺省时,对应着Angle为0,即海龟头方向垂直向下。12.7.3声音的内部谓词及其应用 Prolo
53、g提供了两个声音内部谓词,一个是beep,另一个是sound。 sound(Duration,Frequency) 程序示例 predicates piano tone(char,integer)goal write(a s d f g h j k l键的发声已经定义,按结束程序运行 ), piano.clauses piano:- readchar(Note),tone(Note,Freq),sound(5,Freq),piano. tone(a,131). tone(s,147).tone(d,165). tone(f,175).tone(g,196). tone(h,220). tone
54、(j,247).tone(k,262).tone(l,278).tone(_,18000). 128 PDC PROLOG语言与C语言的连接1281 语言条件Prolog语言可直接与C、PASCAL、FORTRAN和汇编语言编写的程序连接起来。在与其他语言的代码连接之前,还要有三个条件: 这些代码必须编译(或汇编)成标准的OBJ文件。 这些代码要使用32位指针,即必须完全支持80X86系列的大存储器模式。 如果在两种语言之间存在着参数的传递,则其代码的传递方式必须与这两种语言所支持的方式一致。此外,对实数,Prolog语言采用的是IEEE浮点格式。1282 外部谓词说明当采用能与Prolog语
55、言连接的其他语言来编写程序时,必须在Prolog程序的global predicales(全局谓词)段说明此程序为外部谓词。下面是说明用C语言写的mul外部子程序;global predicates mul(integer,inleger,integer)-(i,i,o),(i,i,i) language C这里(i,i,o)和(i,i,i)是表示合法的流模式。i表示输入;调用时已约束,O表示输出,调用时无约束(自由)。程序示例global predicatesadd(integer,integer,integer)-(i,i,o),(i,o,i),(o,i,i),(i,i,i) langua
56、ge Csquare(integer,integer)-(i,o)Goaladd(2,3,X),write(”2+3=”,X),nl,add(2,Y,5),write(”5-2=”,Y),nl,add(Z,3,5),write(”5-3=”,Z),nl,add(2,3,5),write(”2+3=5”),nl,square(5,Sq),write(”5 square is”,Sq),nl.下列C模块实现了square和add所有流模式的功能。 add_0(int x,int y,int *z) /* (i,i,o) flow pattern */ *z = x + y;add_1(int x,
57、int *y,int z) /* (i,o,i) flow pattern */ *y = z - x;add_2(int *x,int y,int z) /* (o,i,i) flow pattern */ * x = z - y;add_3(int x,int y,int z) /* (i,i,i) flow pattern */ if (x + y) != z ) RUN_Fail( );square(int i,int *i_sq) *i_sq = i * i ;1283 参数传递一般所写的外部子程序,常用来传递参数,或是接受信息,或是返回给主程序信息。当传递参数时,应注意以下几点。用户在用80 x86系列的处理器,可选择各种存储器模式, 对外部过程的调用和从外部过程的返回必须是FAR,并且只能用32位指针。 Prolog语言与外部过程是用堆栈来传递参数的。对汇编语言、PASCAL和FORTRAN语言,其自变量是按它们出现的顺序存放在堆栈中的,而大多数C编译程序产生的子程序希望按相反的顺序找到它们的自变量,所以对C语言的参数传递是按相反的顺序压进堆栈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025三层别墅租赁合同
- 2024年第3季度医用注射器运输微粒污染控制标准
- 2025设备租赁合同范本模板
- 班级特色活动的创新方案计划
- 2025年气象、水文仪器及装置项目发展计划
- 教师职业道德与责任感提升计划
- 2025年图像存储与通讯系统(PACS)项目发展计划
- 节约成本与安全保障的平衡计划
- 学校教学工作总体计划
- 社团工作计划运营
- SH/T 3046-2024 石油化工立式圆筒形钢制焊接储罐设计规范(正式版)
- 湖南省张家界市慈利县2023-2024学年八年级下学期期中考试物理试题
- 金属非金属地下矿山监测监控系统建设规范
- 2024年苏州市轨道交通集团有限公司招聘笔试参考题库附带答案详解
- 新概念英语第2册课文(完整版)
- 水培吊兰的养殖方法要领
- 动物的迁徙行为与地球生态系统
- 【小学心理健康教育分析国内外文献综述4100字】
- 校园金话筒大赛(临沂赛区)策划书
- 正确使用文丘里面罩
- 破碎锤施工方案
评论
0/150
提交评论