2011-04-17 1 views
5

j'avais des problèmes avec ces deux lignes:Prolog - meilleur moyen d'éliminer la réponse en double dans un cas particulier?

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

Le problème est que si l'autre des deux premiers arguments sont la liste vide, les deux premières déclarations seraient tous deux utilisés, retournant la même réponse. Cependant, si je mets une coupure dans l'un, ça fait naufrage. J'ai finalement mis dans cette ligne au-dessus d'eux:

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

Et cela fonctionne. Mais je me demandais s'il y avait une solution plus élégante.

+0

Cette coupe est à nouveau rouge Couper. Vous pouvez voir ceci pour: 'list_swizzle (Xs, Ys, Zs), Xs = [_]' qui échoue avec coupe ci-dessus. Il réussit avec une réponse donnée par @daf. – false

Répondre

4

Voilà ma version:

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

Je compte sur [] pas contre l'unification [H | T] dans le premier fait. En d'autres termes [] n'a pas de T parce que c'est la liste vide, donc le premier fait ne correspond pas aux objectifs avec un [] dans le premier argument.

J'ai couru avec succès sur ce SWI-Prolog (multi-thread, 32 bits, version 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 
Questions connexes