首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWI Prolog对call/1的描述:“子句可能有变量作为子子句”?

问SWI Prolog对call/1的描述:“子句可能有变量作为子子句”?
EN

Stack Overflow用户
提问于 2019-12-21 14:52:41
回答 1查看 742关注 0票数 1

对呼叫/1的描述是:

call(:Goal) 将目标作为目标调用。请注意,子句可能有变量作为子子句,这与call/1相同。

我不明白“从句可能有变量作为子从句”。

有人能举个例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-28 22:56:47

主体转换(7.6.2将术语转换为子句的正文)-- la ISO核心标准--要求直接在子句主体内的控制结构中的变量由call/1包装。

下面是一个示例:

代码语言:javascript
复制
?- [user].
and(X,Y) :- X,Y.
^D
?- listing.
and(X,Y) :- call(X), call(Y).

其结果是调用!没有任何效果,因为裁剪限制在call/1中。

在这里可以看到:

代码语言:javascript
复制
?- [user].
p(a).
p(b).
?- p(X), !.
X = a
?- and(p(X),!).
X = a ;
X = b

编辑31.12.2019:

Prolog系统可能希望将(*->)/2 (软剪切)添加到那些参数被转换的控件结构中,从而修改7.6.2。

来自ISO/IEC 13211-1: 1995年Prolog

7.6.2将术语转换为子句的正文 术语T可以转换为目标G,目标G是子句的主体: a) 如果T是一个变量,那么G就是控件构造调用(7.8.3),其参数是T。 b) 如果T是一个主要函子出现在表9中的术语,那么G就是相应的控制结构。如果T的主函子是call/1、catch/3或throw/1,那么T和G的参数是相同的,否则,如果T的主函子是(',')/2或(;)/2或(->)/2,则T的每个参数也将转换为一个目标。 c) 如果T是一个原子或复合项,其主函子FT未出现在表9中,则G是谓词指示符为PT的谓词,而T和G的参数(如果有的话)是相同的。

和

7.8.3调用/1 call(G)是真当且仅当G代表的是一个真实的目标。 当G包含!作为子目标时,!的效果不应扩展到G之外。

和

第37页表9:主要函子和控制构造

  • (',')/2目标参数转换
  • (;)/2目标参数转换
  • (->)/2目标参数转换
  • !/0
  • call/1目标参数未转换
  • true/0
  • fail/0
  • catch/3目标参数未转换
  • throw/1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59437150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档