为什么使用带有lambda和tilde项的映射列表时会出现无限循环?

为什么使用带有lambda和tilde项的映射列表时会出现无限循环?,lambda,prolog,Lambda,Prolog,我有两个谓词使用,tilde term from,lambda和func,以及最后一个既不使用lambda也不使用func的“纯Prolog”做同样的事情: :- use_module(library(lambda)). :- use_module(library(func)). both_lambda_and_func :- maplist(\X^(print(length(X,~))), [`one`,`two`,`three`]). lambda_only :- map

我有两个谓词使用,tilde term from,lambda和func,以及最后一个既不使用lambda也不使用func的“纯Prolog”做同样的事情:

:- use_module(library(lambda)).
:- use_module(library(func)).

both_lambda_and_func :-
    maplist(\X^(print(length(X,~))), [`one`,`two`,`three`]).

lambda_only :-
    maplist(\X^(length(X,Len),print(Len)), [`one`,`two`,`three`]).

func_only :-
    maplist(func_only_helper, [`one`,`two`,`three`]).
func_only_helper(X) :-
    print(length(X,~)).

normal_prolog :-
    maplist(normal_prolog_helper, [`one`,`two`,`three`]).
normal_prolog_helper(X) :-
    length(X,Len),
    print(Len).
所有谓词都应该打印
335
(列表中字符串的长度),其中三个谓词可以正确打印。问题是,
u lambda\u和_func/0
都不打印任何内容,似乎进入了无限循环。我试图
跟踪/0
这个问题,但它对我来说似乎太复杂了。你能告诉我是不是我做错了什么或者这是什么奇怪的错误吗?我使用的是SWI Prolog 7.1.14、func 0.0.4和lambda 1.0.0

?- listing(both_lambda_and_func).
both_lambda_and_func :-
    length(A, B),
    maplist(\A^print(B),
        [[111, 110, 101], [116, 119, 111], [116, 104, 114, 101, 101]]).
不可能在错误的上下文中表达盲目重写的~术语的范围。程序不会终止,因为length/2两个参数都是空闲的,然后生成更长的列表

[trace] 4 ?- both_lambda_and_func.
   Call: (6) both_lambda_and_func
   Call: (7) length(_G1485, _G1486)
   Exit: (7) length([], 0)
^  Call: (7) apply:maplist(\[]^print(0), [[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]])
   Call: (8) apply:maplist_([[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]], user: \[]^print(0))
^  Call: (9) lambda: \([]^print(0), [111, 110, 101])
   Call: (10) copy_term_nat(user:[]^print(0), _G1541)
   Exit: (10) copy_term_nat(user:[]^print(0), user:[]^print(0))
^  Call: (10) lambda: ^([], print(0), [111, 110, 101])
^  Fail: (10) lambda: ^([], user:print(0), [111, 110, 101])
^  Fail: (9) lambda: \(user:[]^print(0), [111, 110, 101])
   Fail: (8) apply:maplist_([[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]], user: \[]^print(0))
^  Fail: (7) apply:maplist(user: \[]^print(0), [[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]])
   Redo: (7) length(_G1485, _G1486)
   Exit: (7) length([_G1478], 1)
^  Call: (7) apply:maplist(\[_G1478]^print(1), [[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]])
   Call: (8) apply:maplist_([[111, 110, 101], [116, 119, 111], [116, 104, 114, 101|...]], user: \[_G1478]^print(1))
^  Call: (9) lambda: \([_G1478]^print(1), [111, 110, 101])
   Call: (10) copy_term_nat(user:[_G1478]^print(1), _G1547)
   Exit: (10) copy_term_nat(user:[_G1478]^print(1), user:[_G1546]^print(1))
^  Call: (10) lambda: ^([_G1546], print(1), [111, 110, 101])
^  Fail: (10) lambda: ^([_G1546], user:print(1), [111, 110, 101])
...
对^的调用出错

^  Fail: (10) lambda: ^([], user:print(0), [111, 110, 101])
因为X已经被实例化为[],而应该是免费的…

library(func)
library(lambda)
是不同的词到体转换。虽然
func
需要它,但是
lambda
是完全动态的-因此,就其所涉及的
lambda
而言,根本不需要假定任何术语到实体的转换。