执行地图功能

时间:2012-08-29 17:53:11

标签: prolog

我正在尝试实现类似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) ?
  1. 如何在提供第一个解决方案后停止?
  2. 如何跟踪?如果我使用trace,它会在第一个解决方案后停止执行。

1 个答案:

答案 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.