执行地图功能

Asl*_*986 3 prolog

我正在尝试实现类似Scheme的map功能,即

map([X1, X2, ..], Fun) ->[Fun(X1), Fun(X2), ...] 
Run Code Online (Sandbox Code Playgroud)

我写了这段代码:

map([], Fun, []).
map([H|T], Fun, [HO|TO]) :- call(Fun, H, HO), map(T,F,TO).
Run Code Online (Sandbox Code Playgroud)

现在,看看这个运行:

?- 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) ?
Run Code Online (Sandbox Code Playgroud)
  1. 如何在提供第一个解决方案后停止?
  2. 如何跟踪它?如果我使用trace它,请在第一个解决方案后停止执行.

Tha*_*dis 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.
Run Code Online (Sandbox Code Playgroud)