我正在尝试实现类似Scheme的map
函数,即
map([X1, X2, ..], Fun) ->[Fun(X1), Fun(X2), ...]
我写了这段代码:
map([], Fun, []).
map([H|T], Fun, [HO|TO]) :- call(Fun, H, HO), map(T,F,TO).
现在,看看这个运行:
?- map([1,2,3], plus(1), X).
X = [2, 3, 4] ;
X = [2, 3, 4] ;
X = [2, 3, 4] ;
X = [2, 3, 4] ;
ERROR: map/3: Arguments are not sufficiently instantiated
Exception: (9) map([3], _G380, _G351) ?
trace
,它会在第一个解决方案后停止执行。答案 0 :(得分:6)
1)您发布的代码存在问题:map(T,F,T0)
应为map(T,Fun,T0)
。没有这个改变我得到你提到的错误;通过这次修正,它可以完美运行。 (将map([], Fun, [])
更改为map([],_Fun,[])
也是一个好主意,因为您不使用变量Fun
- 您应该收到单个变量的警告)
2)当您跟踪并到达第一个解决方案时,请按;
。或者,在swi-prolog中,按spacebar
而不是enter
,跟踪将继续。
6 ?- trace.
true.
[trace] 6 ?- X = 1 ; X = 2.
Call: (7) _G522=1 ? creep
Exit: (7) 1=1 ? creep
X = 1 ;
Call: (7) _G522=2 ? creep
Exit: (7) 2=2 ? creep
X = 2.