Module 在SWI Prolog中,meta_谓词的数值参数意味着什么?

Module 在SWI Prolog中,meta_谓词的数值参数意味着什么?,module,prolog,meta-predicate,Module,Prolog,Meta Predicate,我正在编写一个Prolog程序,并试图将模块整合到程序设计中,以封装复杂性,减少冗余功能 我遇到的一个困难是元谓词的使用。我想在一个模块中定义一个元谓词,然后将其导入到另一个模块中;这带来了复杂性。幸运的是,meta_predicate指令有助于解析模块前缀,但我在理解此处描述的参数时遇到困难: 具体来说,我在数字参数方面遇到了问题。根据文件: 参数是一个术语,用于引用比给定参数术语多N个参数的谓词。例如:调用(0)或映射列表(1,+) 我知道由数值表示的参数将是一个用于引用谓词的术语。我不明白

我正在编写一个Prolog程序,并试图将模块整合到程序设计中,以封装复杂性,减少冗余功能

我遇到的一个困难是元谓词的使用。我想在一个模块中定义一个元谓词,然后将其导入到另一个模块中;这带来了复杂性。幸运的是,
meta_predicate
指令有助于解析模块前缀,但我在理解此处描述的参数时遇到困难:

具体来说,我在数字参数方面遇到了问题。根据文件:

参数是一个术语,用于引用比给定参数术语多N个参数的谓词。例如:调用(0)或映射列表(1,+)


我知道由数值表示的参数将是一个用于引用谓词的术语。我不明白的是,被引用的谓词怎么会比参数项有更多的参数。有人能更深入地解释数字参数什么时候合适,或者举个例子说明什么时候适合使用它吗?

这是一个只有在知道它的意思时才容易理解的公式,可能应该重做

:-meta_predicate maplist(2, ?, ?).
。。。这仅仅意味着“2”位置上的参数将被用作将被调用的谓词的内核。我们没有专门的符号(这是一个很大的错误,IMHO),所以我们将以标准的方式编写它,比如
f(foo,bar)
,或者
f(foo)
,或者
f
。元谓词
maplist/3
将如何处理该术语?好的,它将在语法上对其进行转换,并在其末端附加“2”个额外参数(并且仅在其末端,这会导致尴尬):
f(foo,bar,ARG1,ARG2)
,或
f(foo,ARG1,ARG2)
,或
f(ARG1,ARG2)
。然后
maplist/3
将调用它

例如,对于前面提到的
maplist/3
,使用带有两个参数的谓词:

myprint(X,Y) 
   :- format("~w\n",[(X,Y)]).
它可以在
maplist/3
这样的调用中使用,不指示任何参数:

maplist(myprint,[0,1,2,3],[a,b,c,d]).
两个参数,每个列表中一个,将被添加到术语
myprint
,然后该术语被封为谓词,并被称为:

?- maplist(myprint,[0,1,2,3],[a,b,c,d]).
0,a
1,b
2,c
3,d
true.
这允许一个人传递“部分填充的呼叫”
maplist/2
将在其第一个参数的末尾附加1个参数,因此可以说:

?- maplist(myprint("foo+"),[a,b,c,d]).
foo+,a
foo+,b
foo+,c
foo+,d
true.
上述内容实际上可以与Paulo Moura的结合使用,Paulo Moura将目标包装成匿名谓词,公开参数。然后可以灵活地重新安排事情

?- maplist([X,Y]>>format("~w\n",[(X,Y)]),[0,1,2,3],[a,b,c,d]).
0,a
1,b
2,c
3,d
true.
事实上,
library(yall)
为ISO标准中严重缺失的Lambda表达式提供了正确的语法,以显式显示缺失的参数

人们可以想象很久以前会有这样的表达:

?- maplist(λX.verify(3,X), [1,2,3,4,5]).
或者留在Asciland,比如:

?- maplist(\X.verify(3,X), [1,2,3,4,5]).

但是它没有发生。

元谓词指令指定调用时要添加到谓词的参数数量。下面是一个简单的例子:

:- meta_predicate foo(2, +).

foo(Pred, X) :-
    call(Pred, X, Y),
    format('~q(~q,~q)~n', [Pred, X, Y]).

some_pred(X, Y) :-
    Y is X + 1.
这将产生以下结果。如您所见,
meta_谓词
指令导致
Pred
参数添加模块(在本例中,
user
):

类似于其他语言中的“闭包”的事情可以很容易地完成,也可以使用meta_谓词指令。例如,我们可以

:-meta_predicate foo2(1). 

foo2(Pred):-
    call(Pred, Y),
    format('~q=~q',[Pred,Y]).
并称之为:

?-foo2(some_pred(5)).

... 或
?-maplist(\X^验证(3,X),[1,2,3,4,5])
使用
库(lambda)
,该库仅位于ISO内。。。。但它没有发生。相反,你没有读它。例如,请参见Mycroft&O'Keefe,Prolog的多态类型系统。人工智能23(1984)页。306@false我必须承认我还没有看过
库(lambda)
。但是应该有一个占位符符号。奇怪的是,它被遗漏了。仅仅包括call/N是一个很大的努力。非常感谢您的回答。这回答了我的问题,而且还具有非常简洁的优点。
:-meta_predicate foo2(1). 

foo2(Pred):-
    call(Pred, Y),
    format('~q=~q',[Pred,Y]).
?-foo2(some_pred(5)).