Пролог - лучший способ устранения дубликата ответа в особом случае? - PullRequest
5 голосов
/ 17 апреля 2011

У меня были проблемы с этими двумя строками:

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

Проблема заключалась в том, что если оба первых двух аргумента являются пустым списком, будут использоваться оба первых утверждения, возвращая один и тот же ответ. Тем не менее, если я положу порез в один из них, это рухнет. В конце концов я поставил в этой строке над ними:

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

И это работает. Но мне было интересно, есть ли более элегантное решение.

1 Ответ

4 голосов
/ 17 апреля 2011

Вот моя версия:

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