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 B
A
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.
Ah ne, bunu kod nasıl prolog – Zik
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