5

次の 2 行で問題が発生しました。

list_swizzle(L, [], L).
list_swizzle([], L, L).

問題は、最初の 2 つの引数の両方が空のリストである場合、最初の 2 つのステートメントが両方とも使用され、同じ答えが返されることでした。ただし、1つにカットを入れると、バックトラックが台無しになります。私は最終的にそれらの上にこの行を入れました:

list_swizzle([], [], []):- !.

そして、それは機能します。しかし、もっとエレガントな解決策があるかどうか疑問に思っていました。

4

1 に答える 1

4

これが私のバージョンです:

list_swizzle([H|T], [], [H|T]).
list_swizzle([], L, L).

私は最初の事実で[H|T]に対して統一しない[]を期待しています。つまり、[]は空のリストであるため、Tがないため、最初のファクトは最初の引数の[]とゴールを一致させません。

私はこれをSWI-Prolog(マルチスレッド、32ビット、バージョン5.8.2)で正常に実行しました。

$ cat tt.pl

s([H|T], [], [H|T]).
s([], L, L).

...。

For help, use ?- help(Topic). or ?- apropos(Word).

?- [tt].
% tt compiled 0.00 sec, 920 bytes
true.

?- s(L,[],[]).
L = [].

?- 
% halt
于 2011-04-17T01:53:49.727 に答える