3

私は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は、最初の解決策の後で実行を停止します。
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 に答える