2017-12-11 12 views
1

私はプロローグで入力を取り、それが完全な数であるかどうかを返す方法を考えています。現在、私は近くにいるが、なぜ私が望むように動作していないのか理解できない。 私は再帰によってこれに近づいています。 X%N == 0の場合、NとTT(合計)がTT1に追加されます。 Nが1減少し、関数は、それが1に達するまで、合計が入力番号Xに比較される再帰的に呼び出されます 私のコードは次のとおりです。プロローグで完璧な数字

factors(X,N,TT) :- 
    ( 0 is X mod N -> TT1 is N + TT), 
    TT = TT1, 
    ( N > 1 -> N1 is N-1, factors(X, N1, TT1) 
    ; TT1 = X 
    ). 

perfect(X) :- 
    factors(X, X-1, 0). 

現在、すべての入力が虚偽であることを返します。私はこれが主に間違っているわけではなく、微調整するだけでよいことを願っています。ここで

乾杯

+0

に役立ちます願っています。次に、 'TT1 is N + TT'を計算して統一をチェックすると、' TT = TT1'は 'TT'と' TT1'が別の値にバインドされる可能性があるため、統一は失敗します。 'TT1 is N + TT'の代わりに' TT = TT1'を意味しましたか?あなたの ' - >/2'式とそれに続く統一チェックには"微調整 "が必要です。 – lurker

+2

同じクラスの[あなたの友人](https://stackoverflow.com/questions/47742914/prolog-perfect-number-generation)ですか? [多分この1つ](https://stackoverflow.com/questions/47744880/cant-understand-prolog-line-of-code)? –

+2

@lurker:準備してください、すぐにMjölnirがあなたのものになります。 – false

答えて

0

ソリューションは、それは `要因/ 3`に、` TT`は既に(呼び出しを介して)バインドされている、ように見えます

factors(_,N,N,_). 
factors(X,N,NT,Sum):- 
    N < NT, 
    ( 0 is X mod N -> 
     Sum1 = Sum + N 
    ; Sum1 = Sum), 
    N1 is N + 1, 
    factors(X,N1,NT,Sum1). 

perfect(X):- 
    XT is X/2 + 1, 
    factors(X,1,XT,0). 
関連する問題