2012-07-18 33 views
16

Prologda listelere nasıl eklenir?Prolog'da listelere nasıl eklenir?

append([X|Y],Z,[X|W]) :- append(Y,Z,W). 
append([],X,X). 

Yani [X|W] içinde [X|Y] unsurlarını kaldırarak Z alır ben internette aradık ve ben (http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html itibaren) buldum. Ama iki listeyi nasıl ekleyebilirim?

örneği

appendlist([1,2],[3,4,5],X). 

sonuç X = [1,2,3,4,5] olacaktır.

Ayrıca, özünde ne olduğunu bilmiyorum. (Bunu takip ama anlamadı)

DÜZENLEME: Bilmek istiyorum bunu yapmak önbölüküne() önceden tanımlanmış, ekleme yapılması gibi

cevap

20

yayınladığınız kodu (neredeyse) Tamam. maddeleri sırası sadece (bir üretken bir biçimde kullanıldığında, bu yüklem tanımı üretken kılmak için) takas gerekiyor: Bu üç argüman arasındaki ilişkiyi tanımlayan

append([],X,X).       % your 2nd line 
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line 

, en A, B ve C diyelim . İlk hat diyor

, "C ikisi de aynı kafasını (yani ilk eleman) ve kuyruk arasında var A ve BA eğer C olan Boş olmayan listeler ekleme sonucudur C, A kuyruğunun aynı 2. argüman, B " ile eklenmesi sonucudur.

a  a 
    ---------- 
    b  b 
    c  c 
    . d d 
     e e 
     . . 

Bunu düşünün, mükemmel bir anlam ifade eder. Ne yaparsak, append/3 ilişkisini tanımlamak istiyoruz ve ne olmasını istediğimizi biliyoruz, bu yüzden bunu yerine getirmemizi istediğimiz bazı açık gerçekleri, yapacağınız takdirde takip etmesi gereken yasaları yazıyoruz.

Bu kodun bizim için önceden tanımlanmış olduğunu varsayarsak, hangi yasaları takip etmeliyiz?Açıkçası, başka bir listeyle bazı listenin bir kuyruğunu eklemek bize o listeyle tam listeye ekleme sonucunu bir kuyruk haline getiriyor.

Bu, ilk listeyi nasıl "kaydırdığımız" anlamına gelir. Ama ya kaydırılacak daha fazla yer yoksa? Ya bu listenin sonuna ulaşırsak? Sonra boş listeye geldik ve başka bir liste ile boş bir liste ekleyerek bize bu listeyi sonuç olarak veriyor. Açıkçası. Ve kodunuzdaki 2. satırın bu olduğunu söylüyor, diyor, boş liste ekleyerek "başka bir liste ekleyerek bu listeyi" sonuç olarak üretir.

Şaşırtıcı, append/3 izlemesi gereken bu iki yasayı yazılı olan, tanımı kendisi yazmaktan aynıdır.

ek Bu bakış bildirge açıdan bunu açıklar; Operasyon açısından daha fazla gösteren an answer by m09 kontrol edin.

9

çalışması için kodlanmış Ama nasıl olmalıdır nasıl Birlikte iki liste ekledim mi?

Kendi soruyu yanıtladı: Sen append/3 kullanın.

Eğer Z sonucu X ve Y eklemek ve saklamak istiyorsanız,

append(X, Y, Z) 

sonra Z[1, 2, 3, 4, 5] bağlı olacaktır Örneğin X = [1, 2] ve Y = [3, 4, 5] için yapın:

| ?- append([1,2],[3,4,5], X). 

X = [1,2,3,4,5] 

yes 
| ?- 
+1

Ah ne, bunu kod nasıl prolog – Zik

+5

Sen kod ekleme yapılması() aynı yolu 'append' kodlanmıştır gibi benzer işlev görür anlamına !? Uygulamayı zaten keşfettiniz (bu, sorunuzdaki ilk iki kod satırıdır). – aioobe