A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).
Çevrimiçi deneyin!
+/2
Bir dizeyi (karakter kodları listesi biçiminde) ilk argüman ( A
) olarak alan ve ikinci argümanını ( B
) en yüksek sıralı simetrik dönüş sırasına göre ayarlayan yüklemi tanımlar .
açıklama
Bu program, bir ip üzerindeki simetrik rotasyon setinin döngüsel bir grup olduğu gerçeğini kullanır ve bu nedenle simetrik rotasyon setinin sırası, en yüksek dereceli simetrik rotasyonun sırasına eşittir. Böylece program girdi dizgisinde toplam simetrik rotasyon sayısını bularak istenen sonucu hesaplayabilir.
Kod Açıklaması
Ağır kaldırma işleminin çoğunluğu findall/3
yüklem için yapılan bir çağrı ile yapılır . findall/3
Yüklem (ilk bağımsız değişken için bütün olası değerleri bulur X
ikinci bir değişken olarak ifade (doğru olduğu durumda), bu (append(X,Y,A),append(Y,X,A))
daha sonra bu konuya daha). Son olarak, bu olası değerlerin her birini X
son argümanda ( [_|Z]
) bir liste olarak saklar .
Geçirilen ifadesi findall/3
ikinci arugment olarak, (append(X,Y,A),append(Y,X,A))
kullandığı append/3
belirtmek için yüklemi X
bazıları henüz tanımlanmamış ile birleştirilmiş Y
eşit olmalıdır A
, girdi dizesi ve aynı olduğunu Y
ile birleştirilmiş X
zorunluluk da eşit olması A
. Bu , önden kaldırılıp arkaya eklendiyse, elde edilen dize ile aynı X
olacak şekilde bir önek olması gerektiği anlamına gelir . Bu özelliğe sahip olan s kümesi , simetrik dönüşleri ile neredeyse birebir yazışmalara sahiptir . Her zaman tam olarak tek bir çift sayım vakası vardır, bu da hem boş dizenin hem de öneklerinA
A
A
X
A
A
A
0-dönüşüne karşılık gelir A
. Bu yana 0
bir -ROTATION A
sonuçtaki listesinin simetrik uzunluğu her zaman X
s'den findall/3
simetrik dönme sayısının birden fazla olacaktır A
.
Çift sayım problemini çözmek için findall/3
yüklemin üçüncü argümanında desen eşleştirme kullanıyorum . Prolog'da listeler başlarının (ilk eleman) ve kuyruklarının (geri kalanı) çiftleri olarak temsil edilir. Böylece [_|Z]
kuyruğu eşit olan bir listeyi temsil eder Z
. Bu, uzunluğunun yüklem Z
tarafından bulunan önek sayısından daha az olduğu findall/3
ve dolayısıyla simetrik dönüş sayısına eşit olduğu anlamına gelir A
. Son olarak, uzunluğunu length/2
ayarlamak B
için yüklem kullanın Z
.