2011-12-18 21 views
6

Aşağıdakileri gerçekleştirmeye çalışıyordum, iki listem varsa, L1 ve L2, sonuç (R) olmasını istedim. L1'den L2'nin "çıkarılması".Bir şey ([_]) ile bir şey arasındaki fark nedir (_)

Örnek:

L1 = [1,2,3] 
L2 = [2,3,4,5] 

R = [1] 

Bunu başarmak mümkün WAS ama _ ve [_] arasındaki fark nedir söyleyemem.

ben yaparsanız bu:

diferencia([],_,[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

Ben bunu yaparsam, yanlış bana verir, çalışır:

diferencia([],[_],[]). 
diferencia([X|Tail],L2,R):- 
    member(X,L2), 
    diferencia(Tail,L2,R). 
diferencia([X|Tail],L2,[X|R]):- 
    not(member(X,L2)), 
    diferencia(Tail,L2,R). 

O zamandan beri L2 olacak hep çalışmalıdır şey [_] içeren bir liste varsayılabilir liste ol. (

cevap

8

Aslında, _, yalnızca bir değişken ve bir değişkenle eşleşir. Burada, 2, 3, 4, 5 (dört değişken) ile eşleşmesini istersiniz. Yapamaz. Sadece [2, 3, 4, 5] (liste) ile eşleşebilir. Baş ve kuyruk her eleman düzgün bir anonim ile eşleşti böylece _ sayısı listedeki öğelerin tam sayı olmak üzere ([2|[3, 4, 5]])

Ya [_, _, _, _, _, _, ...] eşleştirilir böylece [_|_] yazmak zorunda ediyorum değişken.

Unutulmaması gereken temel nokta, _'un sadece normal bir değişken olmasıdır. Bunu hatırlamakta zorlanıyorsanız, sadece _Head ya da _Accumulator gibi açık isimleriniz varsa, kodunuzu yazdığınız şeyin aslında bir değişken olduğunu, ancak bunu umursamadığınızı fark ettiğinizde (_ won ile başlayan değişken) En azından bir tek değişkenli uyarı üretmez, bu yüzden daha iyi bir genel netlik için _ yerine kullanılabilirler).

Edit: başka bir şekilde söylemek gerekirse başlığınızda, _ bir şey olduğunu düşünün. Ama her şey bir şey olamaz ve her şey çok şey olabilir. _ sadece bir şey olabilir. Yani çalışmıyor nedeni şudur:]

+0

değişken ile Eşleşmeyecek _' gerçekten normal bir değişken değildir. '_' Adlı iki değişkeniniz varsa, bunlar birleşmez, iki farklı değişkenlerdir. – svick

+0

normal değişkeni, anonim değişkenlerin, eşleşme kalıpları söz konusu olduğunda normal bir değişkenin yapamayacağı şeyleri yapamayacağını ima etmek için kullanılmıştır. Yukarıdaki örneklerde, iki anonim değişkenin zorunlu olarak birleşmediği gerçeği ortaya çıkmıştır. Yine de açıkladığın için teşekkürler! – m09

4

_ olduğunu
[_] tam olan bir listedir, [1,2], çubuk (42, foo [2,3,7]) vb şey ... foo L2 birden fazla öğesi vardır (ya da boş listedir) eğer örnekte için herşeyi

olabilir tek unsur o zaman `denilen [_]

İlgili konular