2016-11-15 8 views
-1

基本的には、リストの2番目の最小値を見つけようとしています。問題は、数値の代わりにminoとsecondMinがfalseを返すことです。 minlist(List、Min)を手動で実行するとMin = numberが返されますが、その値をとるには秒を取得できません。代わりに、それはfalseのままです。誰も助けることができますか?値を返すべきときにプロローグを印刷する

第2の最小

secondMin(L, Min2):- 
    minlist(L,Min), 
    delete(L,Min,Li),     %no prob ver 
    mino(L, k),     %return k as the 2nd minimum of L 
    Min2 is k.     %Min2 is k. 
//////////some code here//////////// 

mino(List, sec):- 

    sec is minlist(List, Min).    %min 2 is the minimum of Li 
+2

'sec'は定数であり、変数ではありません。 – false

答えて

2

あなたはチュートリアルを読んだり、教科書を取得する必要があります。算術 "関数"のみが値を返し、他のすべての述語はそのモードで呼び出された場合に、引数の1つを出力に使用します。

ですから、述語の開始時に正確に何回かそれを行うと、突然あなたはそれが間違ってやって起動するので

minlist(List, Min) 

代わりの

Min is minlist(List) 

のようにそれは少し奇妙である何か。 「リストの2番目の最小数」については

、これは簡単に次のようになります。

二番目に小さい要素がリストでソートされたリストの2番目の要素です。

second_smallest(List, SS) :- 
    sort(List, [_,SS|_]). 

リストが地面でない場合、これは壊れるが、そう、あなたのオリジナルの試みはありません。

関連する問題