A+B:-findall(X,(append(X,Y,A),append(Y,X,A)),[_|Z]),length(Z,B).
Çevrimiçi deneyin!
+/2Bir 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/3yüklem için yapılan bir çağrı ile yapılır . findall/3Yüklem (ilk bağımsız değişken için bütün olası değerleri bulur Xikinci 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 Xson argümanda ( [_|Z]) bir liste olarak saklar .
Geçirilen ifadesi findall/3ikinci arugment olarak, (append(X,Y,A),append(Y,X,A))kullandığı append/3belirtmek için yüklemi Xbazıları henüz tanımlanmamış ile birleştirilmiş Yeşit olmalıdır A, girdi dizesi ve aynı olduğunu Yile birleştirilmiş Xzorunluluk da eşit olması A. Bu , önden kaldırılıp arkaya eklendiyse, elde edilen dize ile aynı Xolacak ş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 öneklerinAAAXAAA0-dönüşüne karşılık gelir A. Bu yana 0bir -ROTATION Asonuçtaki listesinin simetrik uzunluğu her zaman Xs'den findall/3simetrik dönme sayısının birden fazla olacaktır A.
Çift sayım problemini çözmek için findall/3yü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 Ztarafından bulunan önek sayısından daha az olduğu findall/3ve dolayısıyla simetrik dönüş sayısına eşit olduğu anlamına gelir A. Son olarak, uzunluğunu length/2ayarlamak Biçin yüklem kullanın Z.