Tuple yapıcıları ve eksileri olarak aritmetik işleçleri kullanma
İki veya daha fazla değerden oluşan tek bir yapıyı geçmeniz gerekiyorsa, kullanılacak en belirgin şey bir listedir, örn. [A,B]
. Yine de bu çok ayrıntılı.
Bir alternatif var. Prolog değerleri, değerlendirilmeyen oldukça keyfi bir iç içe yapı saklayabilir. Bunun nasıl çalıştığını gösteren bir örnek:
| ?- member(member(A,B),C).
C = [member(A,B)|_] ? ;
C = [_,member(A,B)|_] ? ;
(etc.)
member(A,B)
bu durumda sadece adlandırılmış bir demet ve dış member
(bir işlev çağrısıdır) ona böyle davranır.
Adlandırılmış tuples, golf oynamamış Prolog programlamasında oldukça yararlı olsa da, liste yaklaşımından daha ayrıntılı görünebilirler. Bununla birlikte, tuple yapıcısının adında hemen hemen rastgele karakterler kullanabiliriz (düzgün bir şekilde alıntılandıklarını varsayarak); sevimli member
bir şey ya da tek bir karakter yerine, böyle bir a
şey yapabiliriz:
| ?- A = '-'('/'(1,2), '/'(3,4)).
A = 1/2-3/4
Burada, tuple yapıcılarımız '-'
ve '/'
. Ve güzel yazıcının onlarla ne yaptığını not etmek ilginç; tuples için infix gösterimi kullanıyor . Bu gerçekten kesiktir ve karşılaştırılabilir aritmetik işlemle aynı şekilde ayrıştırılır. (Aritmetik kullanımları nedeni de açıklıyor is
değil =
; A = 1+2
birleştirecek A
olan başlığın '+'(1,2)
tuple yapıcı çağrılacak Çünkü böylece ayrı sözdizimi aslında unevaluated aritmetik ifade değerlendirmek için gereklidir.) Bir şey , siz de kısa ve öz olan bir karakter kullanabilir sözdizimi (ve bonus olarak -
ve/
anlamlı olmayan bir şeyden ziyade aynı şekilde, hızlı bir takas tuple yapıcısı istediklerinde golf dışı koddaki en yaygın seçeneklerden bazılarıdıri
genellikle bir döngü değişkeni olarak kullanılır, bu nedenle orada herhangi bir nedenle bir demet istiyorsanız, giriş ve çıkışlarınızda kullanmak tamamen mantıklıdır).
'-'
ve '/'
tuple kurucuları için iyi seçimlerdir, çünkü tuple değişmezlerini ters yazmanıza izin veren iyi davranışlı ve kullanışlı önceliğe sahiptirler. Ancak, programın içinde ara değerler üretilirken öncelik konusunda endişelenmenize gerek olmadığını unutmayın. Prolog, kodları kaynak kodu yerine ağaç olarak saklar ve güzel yazıcılar bunu net bir şekilde çıktılar:
| ?- A = '-'('-'(1,2), '-'(3,4)).
A = 1-2-(3-4)
Tanımlama grubu sözdizimi terse böylece olduğundan ( f(A,B)
daha kısadırf(A-B)
) olduğundan, birden fazla tahmin argümanını ücretsiz olarak tuples ile değiştirebilirsiniz, yani bir yüklemin iki veya daha fazla argümanını başka bir yükleme geçirmesi gerekiyorsa, bunları genellikle bir demet ve sadece demet geçirin (bu, yüklemin kendisine ek olarak uygun bir demet yapıcıları ve virgül karışımı kullanmak için yükleme yapılan tüm çağrıları değiştirmeyi gerektirse de).
Bu sözdiziminin bir diğer avantajı, listeleri dahili olarak kullanmanız gerektiğidir (standart tahminlerle birlikte çalışmak yerine); bir liste temel olarak sadece iç içe eksilerini içeren bir kümedir ve eksileri hücre, '.'
burada görülebileceği gibi, yapıcı içeren bir demettir :
| ?- Q = '.'('.'(A,B),'.'(C,D)).
Q = [[A|B],C|D]
Kodunuz "el ile" listeleri kullanıyorsa, daha az hacimli bir grup yapıcısı kullanmak mantıklı olabilir '.'
. Benim için ortak bir seçim bir eksilerini temsil etmektir '/'(Tail,Head)
(çünkü karakter israf etmeden hata ayıklama çıktısında alabileceğiniz en okunaklı hakkındadır). Muhtemelen kendi []
eşdeğerinizi de isteyeceksiniz ; Eğer olabilir kullanmak[]
ama uzun iki bayt olduğunu ve bunun yerine kullanabileceğiniz tek baytlık atomları (tümü küçük harf) bol vardır.
Örneğin, aşağıdaki liste:
[1,2,3]
bunun gibi aynı sayıda karakterde manuel temsile dönüştürülebilir:
x/3/2/1
[H|T]
-senin örüntü eşleşmelerinin artık daha tersine yazılabilmesi T/H
ve boş listeye x
daha uzun değil , bir testin yazılması avantajını elde etmek []
. (Elbette, bu bariz dezavantajını da beraberinde member
, append
vb bu temsilin çalışmaz.)
prolog
Etiket tür işe yaramaz. Bir Interpret Prolog mücadelemiz olmadığı sürece buna ihtiyacımız yok.