5

Prolog'u öğreniyorum ve bir egzersiz olarak, verilen sayıya kadar tüm sayıların toplamını hesaplayan basit bir veri tabanı deniyorum (yani 0 = 0, 1 = 1, 2 = 3, 3 = 6) 4 = 10, ...). Yeterince kolay:Bu Prolog'da kuyruk özlemi yapılabilir mi?

yığın taşması ile bir yere counting_sum(150000, X). etrafında darbeler
counting_sum(0, 0). 
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1, 
    counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum. 

. Ben Prolog kuyruk özyinelemeye yapabilir anlamak, ancak kural sonuna özyinelemeli çağrı taşırsanız, ben de en counting_sum(PrevNum, PrevSum) ile birleşik oldu önce PrevSum kullanamaz beni anlatıyor varsayalım

error(instantiation_error,(is)/2) 

olsun . Bu doğru mu ve bu kuyruğu tekrarlamak için herhangi bir yol var mı? Eğer fark yaratan GNU Prolog 1.3.1 kullanıyorum.

P.S. Terminolojide hala titriyorum. Terimlerini yanlış kullanmış olsaydım haber ver. Böyle

+1

Sen örnekleme hatasının nedeni hakkında doğru. –

cevap

8

deneyin şey (bir akümülatör kullanın):

counting_sum(Count, Sum):- 
    counting_sum(Count, 0, Sum). 

counting_sum(0, Sum, Sum). 
counting_sum(Num, PrevSum, Sum):- Num > 0, PrevNum is Num - 1, 
    NextSum is PrevSum + Num, 
    counting_sum(PrevNum, NextSum, Sum). 
+1

Teşekkürler. Akümülatörlerle karşılaşmadım. [Yararlı bir deyim gibi görünüyor] (http://www.lix.polytechnique.fr/~liberti/public/computing/prog/prolog/prolog-tutorial.html#iteration). Bir akümülatörün ne olduğunu okuduktan ve anladığımdan, birini kullanarak yeni bir uygulama yazabildim ve kodunuza göre kontrol edebildim. Ben de aynı şeyle geldim. Sorun: Hala 'counting_sum (350000, X)' de bir yığın taşması oluyor. ”Bunun nedeni nedir? –

+1

Bu garip. SWI ile birlikte verdiğim kodu '3500000' ile (şeklin on katı) denedim ve kolayca kullanabiliyordum. – gusbro

+2

Spekülasyon yapıyorum, ancak GNU Prolog yorumlanmış modda kuyruk optimizasyonu yapamayabilir (ancak SWI Prolog yapar). @RyanStewart: derlenmiş bir gprolog çalıştırılabilir mi, yoksa sadece yorumlayıcı mı kullandığını onaylamaya ne dersiniz? – hardmath

İlgili konular