2017-04-20 10 views
0

Prologでは、私はMax関数を作ったが、他の人に返す数値を比較しようとしていて、正しい数値を与えていないとわかる。私のリストは[2,2,1,2]なので、私のmaxは2でなければなりませんが、私が見つけた最大値を2と比較すると失敗します。最大機能が正しい答えを与えていない

私のコードは次のようになります。

maximumElement([X], X). 
maximumElement([H|T], MaxFound):- 
    maximumElement(T, MaxOfTail), 
    MaxFound = max(MaxOfTail, H). 

私の問題は、また、私は数字を比較していますすることができどこが、呼び出されたときに、述語は、次のようになりますように、今、私はそれを変更した:

maximumElement(List, MaxFound), 
checkIfTwo(MaxFound, MaxFound). 

そして、これはそれで述語です:私はそのようにそれを比較しておりますので

checkIfTwo(2,2). 

、それはよ私は同じ数字を比較しているので、私は間違っているだろうと私は奇妙なので、私はそれが私の比較や最大値の問題でなければならないと思う。あなたが使用しているため

+3

In Prolog '='は式割り当てではありません。これは、用語統一演算子です。それは同じことではありません。算術関数、算術演算子、または 'is/2'が必要です。 – lurker

+0

@lurker私は 'MaxFound = max(MaxOfTail、H)'を持つ 'is/2'を使ってみましたが、それでも間違った答えを出すので問題はないと思います。 –

+1

あなたは 'MaxFound is max(MaxOfTail、H)'の代わりに – false

答えて

0

maximumElement([X], X). 
maximumElement([H|T], MaxFound):- 
    maximumElement(T, MaxOfTail), 
    MaxFound is max(MaxOfTail, H). 

を言うのには十分であるが、私はあなたが問題を持っているので、とにかく答える書くコメントで誰もが言ったように、それだけで任意の要素ではない、それは数または算術式でなければなりませんis max()だから、選択肢が残っていないにもかかわらず、名前はあまりにも大きくないし、choicepointも得ている。だから、多分あなたは代わりに書くことができ

?- maximumElement([1+2,2], Max). 
Max = 3 ; 
false. 

を::

max_arith_expr([X|Xs], Max) :- 
    max_arith_expr(Xs, X, Max). 

max_arith_expr([], X, X). 
max_arith_expr([X|Xs], X0, Max) :- 
    max_arith_expr(Xs, X, Max0), 
    Max is max(X0, Max0). 

をしかし、なぜ実際にそれは非末尾再帰で見て?おそらく必要なのでしょうか?あなたはすでに3つの引数を持っている場合、あなただけの

max_arith_expr([], Max, Max). 
max_arith_expr([X|Xs], Max0, Max) :- 
    Max1 is max(X, Max0), 
    max_arith_expr(Xs, Max1, Max). 

最大蓄積することができます。しかし、私はこれが今まさにあなたがalrady here in the libraryを持っていたもののように見えるかと思いますので、これは何とか良いか悪いか、その両方である場合ので、私は知らないのですか?

関連する問題