网站大量收购闲置独家精品文档,联系QQ:2885784924

Prolog语言是一种典型的逻辑程序设计语言。.ppt

Prolog语言是一种典型的逻辑程序设计语言。.ppt

  1. 1、本文档共139页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Prolog语言是一种典型的逻辑程序设计语言。

5.6.3 参数传递 PROLOG语言与外部过程是用堆栈来传递参数的。对汇编语言、PASCAL和FORTRAN语言,其自变量是按它们出现的顺序存放在堆栈中的,而大多数c编译程序产生的子程序希望按相反的顺序找到它们的自变量,所以对c语言的参数传递是按相反的顺序压进堆栈的(也有少数c编译程序是按其他方式传递参数的,因此,苦选用C语言,则应确认编译程序究竟是按什么顺序传递参数的)。 5.6.3 参数传递 PROLOG语言中的每种数据类型,在存储器中是以某种具体形式表示出来的。表6.1给出了各种数据类型及其存储方式。当字符、整数或实数型参数从PROLOG语言传递到子程序时,实际上压入堆栈的是其数值;而对符号、字符串或复合型的参数,则是其地址被压进堆栈。由此须注意的是:当外部子程序存在着返回参数给PROLOG语言,则必须在输出参数指向的地址处,由PROLOG语言装入一数值。 5.6.3 参数传递 5.6.3 参数传递 每当PROLOG语言调用外部过程时,传递参数的压栈顺序是:任何自变量都按压进堆栈,接着BP寄存器的当前值压进堆栈,然后退回地址压进堆栈。这样的信息排列,称为激活记录。使用者应知道每段信息位于何处,以便对自变量能正确存取。返回地址在堆栈中总要占4个字节EBP寄存器的当前状态需要2个字节表示;而对输人参数,其字节大小将取表6.1所列的数值,对输出参数则是取4个字节。 5.6.3 参数传递 5.6.4 外部C语言子程序 从表6.1可看出,字符、整数和实数型是直接将输人参数的值传递到堆栈,而字符串、符号和复合型是将其地址压进堆栈。这意味着字符、整数或实数型的传递参数将作为c语言的int、flaot和char的数据类型来处理;而对字符串、符号和复合型的传递参数,则要用c语言的char *数据类型——指针(或是指向复合结构的指针)来处理,因为只有地址(指针)能传递到c语言子程序。所有的返回参数必须使用相应的指针类型。 5.6.4 外部C语言子程序 如下面的函数是将两实数相乘,并以第三个参数返回结果。 mul (a, b, c) float a,b; float *c; { *c=a*b;} 所用的C编译程序必须使用32位指针(有些编译程序可能将此条件看成“大存储器模式选择”),许多c编译程序允许在16位和32位指针之间选择,因此要确认选择是正确的。如果编译程序不能以32位指针方式工作,它就不能与PROLOG语言相连接。 5.6.4 外部C语言子程序 下面的命令行是连接C模块与PROLOG模块: LINK INIT + P + C + P.SYM,PROGRAME,PROLOG十CLIB 其中P表示PROLOG代码,C表示C代码。一般C语言库函数被包括在库函数清单里,大多数C编译程序将调用函数库CLIB。 5.6.5 两个限制 当用字符串或符号作为输出参数时,必须注意两条特定的重要限制。 (1)PROLOG语言仅当字符串变量被约束之后,才对其分配存储空间。因此,下列代码段将不能正确操作,并且可能会使你的计算机“Down”机。 C语言代码段: global predicates strcpy(string, string) – (i, o) language C …… 5.6.5 两个限制 PROLOG语言代码段: clauses start:- A=“this is test”, strcpy(A,B), write(B). strcpy是c语言的标准字符串拷贝函数(strcpy函数仅将字符串A的内容拷贝到变量B里去)。之所以这个代码段不能完成拷贝,是因为变量B在调用时没有被约束为任何值,因此系统对它没有分配存储空间,即它的指针无所指。 5.6.5 两个限制 当strcpy准备拷贝字符串A的内容到变量B时,strcpy将会把它们放到内存的某一随机点上——这很可能会导致程序死去。克服这一问题的惟一办法是在调用前,系统先将一哑值约束到变量B中。这样系统就会分配存储空间给变量B,以便字符串拷贝函数能正常工作。当然,将变量B约束为一值,就意味着strcpy的说明必须改为两个输入参数。这种方法看起来似乎奇怪,但是,这是对这种类型操作的惟一途径。修改

文档评论(0)

youbika + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档