?- 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]]).
It's impossible to express the scope of the ~ term, that is rewritten blindly, in the wrong context. The program doesn't terminate because length/2 has both arguments free, then generate ever longer lists.
[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])
...
The call to ^ goes wrong
^ Fail: (10) lambda: ^([], user:print(0), [111, 110, 101])
because X it's already instantiated to [], while should be free...