2012-04-11 7 views
1

私は与えられた数の除数の数を数える述語に取り組んでいます。それはすべてを数えるわけではありませんが、2つ以上の要因があることを知るには十分です。ここで私が持っているものである。しかしプロローグ数の除数

countFactors([_,_,_,_X]):-!. 
countFactors(Product, Count,Divisor, _X):- 
    Divisor =< Product/2, 
    Product mod Divisor = 0, 
    NewC is Count + 1, 
    NextD is Divisor + 1, 
    countFactors(Product,NewC, NextD, NewC). 

、countFactors(16,0,2、X)を実行しています。単純にfalseを返しますが、私はX = 2を返すと期待します。

EDIT:これで、Falseを返す理由がわかりました。問題の除数が要因であり、再帰するとうまくいきます。しかし、それが要素でない場合はfalseを返しますが、次の除数にはインクリメントしません。停止してfalseを返します。

私の質問は、どうすれば修正できますか?

答えて

1

コードに何らかの誤りがありますが、何らかの修正を掲載しています。たぶんあなたはマイナーな変更を行う必要があります。

%% count all factors of Product 
% 
countFactors(Product, Count, Divisor, Tot) :- 
    Divisor > Product/2, 
    !, Tot is Count. 
countFactors(Product, Count, Divisor, Tot):- 
    ( Product mod Divisor =:= 0 
    -> NewC is Count + 1 
    ; NewC is Count 
    ), 
    NextD is Divisor + 1, 
    countFactors(Product, NewC, NextD, Tot). 
+0

すみません、私は本当にあなたがここで何をやったかを理解していません。これはすべての入力プロダクトに対してX = 2を返します。 countFactors(3,0,2、X)。 X = 2を返します。明らかにこれは真実ではありません... – XavierNuquos

+0

申し訳ありませんが、私はデバッグしていません... – CapelliC

関連する問題