发布于 2019-12-28 22:56:47
主体转换(7.6.2将术语转换为子句的正文)-- la ISO核心标准--要求直接在子句主体内的控制结构中的变量由call/1包装。
下面是一个示例:
?- [user].
and(X,Y) :- X,Y.
^D
?- listing.
and(X,Y) :- call(X), call(Y).其结果是调用!没有任何效果,因为裁剪限制在call/1中。
在这里可以看到:
?- [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目标参数转换!/0call/1目标参数未转换true/0fail/0catch/3目标参数未转换throw/1https://stackoverflow.com/questions/59437150
复制相似问题