2011-04-17 14 views
5

Ben bu iki çizgi ile sorun yaşıyordu:Prolog - özel durumda yinelenen yanıtı ortadan kaldırmak için daha iyi bir yol?

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

sorun ilk iki argüman her iki boş liste varsa, ilk iki ifade de aynı cevabı dönen, kullanılacak olmasıydı. Bununla birlikte, bir tanesini bir kestirirsem, geri izlemeyi batırır. Sonunda bu satırın üstlerine şu satırları ekledim:

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

Ve işe yarıyor. Ama daha zarif bir çözüm olup olmadığını merak ediyordum. | İlk aslında [T H] karşı birleştirici değil [] güveniyorum

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

:

+0

Bu kesim yine bir kırmızı başarıyla bu koşuyoruz kesmek. Bunun için şunu görebilirsiniz: 'list_swizzle (Xs, Ys, Zs), Xs = [_]' yukarıdaki kesimle başarısız. @daf tarafından verilen bir cevap ile başarılı olur. – false

cevap

4

İşte versiyonu. Diğer bir deyişle, [] boş bir liste olduğu için T'ye sahip değildir, bu yüzden ilk olgu ilk argümandaki hedeflerle eşleşmez.

Ben SWI-Prolog (, Versiyon 5.8.2 32 bit Çok parçacıklı)

$ 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 
İlgili konular