2017-05-06 9 views
0

私はこのfucntionを用いて全ヨーロッパの人口をカウントしようとしています:再帰回数SWI-Prologの

printEuropePopulation(A) :- 
    country(_, X, _, _), 
    printEuropePopulation(A+X), 
    true. 
printEuropePopulation(A) :- write(A). 

そして、プログラムは私に

ローカル・スタックのうち

Iを与えます私の電話に電話する

printE私はそれを修正するにはどうすればよい

country("Slovenia",20,2009,27300). 
country("Finland",338,5238,35500). 
country("France",549,60876,33800). 

:uropePopulation(0)

事実のように見えますか?前もって感謝します。

+1

2番目の引数は、人口ではなく、千単位のkmです。あなたの第3引数は人口です。 –

答えて

2

私は思う再帰的な述語でこれを行うことはできませんか?すべての事実を集めて合計を見つける方が簡単です。あなたの定義では

total_population(Total) :- 
    findall(P, country_population(_, P), Ps), 
    list_sum(Ps, Total). 

あなたはそれが思わ面積を取っているが、私は何千人もの人口を取る:

country_population(C, P) :- country(C, _, P, _). 

今あなたが持っているので、あなたが再帰的な述語を行うことができます合計を検索する場合すべての人口数(2番目の引数?)をリストに入れます。

list_sum([], 0). 
list_sum([X|Xs], Sum) :- 
    list_sum(Xs, S0), 
    Sum is S0 + X. 

今、あなたはcountry

?- total_population(P). 
P = 68123. 

の第二引数の合計を見つけるためにそれを照会することができますしかし、あなたはSWI-Prologのを使用している場合もあるため、「集計」と呼ばれるもののライブラリを使用することができますたとえば、合計を集計するために使用することができます。

+0

ありがとう、それは動作します。あなたの事例を使って最終結果を印刷する方法は? – Burning

+0

@Burning最終結果を印刷することを意味しますか?答えに示されているように私が質問すると、それはすでに印刷されます。それをプリンタまたはファイルに印刷しますか? –

+0

いいえ、私の画面に印刷するだけで、あなたのコードは出力に "false"を返します。私は再帰の各段階で結果を書こうとしましたが、完璧とは言えますが、最終的な値が必要です。 – Burning