3

我正在尝试实现类似方案的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它在第一个解决方案后停止执行。
4

1 回答 1

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.
于 2012-08-29T18:08:25.713 回答