gpt4 book ai didi

lambda - 为什么在使用具有 lambda 和波浪号项的 Maplist 时会出现无限循环?

转载 作者:行者123 更新时间:2023-12-02 06:37:14 27 4
gpt4 key购买 nike

我有几个谓词使用 lambda 做同样的事情,波形符术语来自 func ,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(列表中字符串的长度),其中三个谓词正确执行。问题是 both_lambda_and_func/0 不打印任何内容,并且似乎进入无限循环。我尝试trace/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 它已经实例化为 [],而应该是免费的......

关于lambda - 为什么在使用具有 lambda 和波浪号项的 Maplist 时会出现无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com