2017-04-18 5 views
1
may(_,[],[]). 
may(num(U),[est(C1,N1,NT1)|T1],[est(C1,N1,NT1)|T2]):- 
    U =< NT1, 
    may(num(U),T1,T2). 

min(_,[],[]). 
min(num(U),[est(C2,N2,NT2)|T3],[est(C2,N2,NT2)|T4]):- 
    U > NT2, 
    min(num(U),T3,T4). 

main:- 
    U is 2.0, 
    mayores(num(U), 
     [ est(3,"J",3.1), est(6,"P",4.5), est(7,"L",2.0), est(4,"R",1.5), 
     est(2,"C",4.7), est(5,"F",2.0), est(9,"A",3.5), est(11,"K",4.8), 
     est(8,"M",2.4), est(15,"S",1.5), est(17,"D",0.5), est(19,"G",2.0) 
     ], 
     T2), 
    menores(num(U), 
     [ est(3,"J",3.1), est(6,"P",4.5), est(7,"L",2.0), est(4,"R",1.5), 
     est(2,"C",4.7), est(5,"F",2.0), est(9,"A",3.5), est(11,"K",4.8), 
     est(8,"M",2.4), est(15,"S",1.5), est(17,"D",0.5), est(19,"G",2.0) 
     ], 
     T4), 
    write(T4), 
    write(T2), 
    halt. 
:- main. 

コードでは、別のリストに値< = 2と値> 2を分ける必要があります。それは私がideoneにそれを実行するときに私にこのエラーを与えた。ゴール(ディレクティブ)に失敗しました:ユーザ:メインProlog sw0

Goal (directive) failed: user:main. 
+2

あなたは 'mayores'と' may'を使用しています... – false

答えて

3

まず第一に、あなたのプログラムでhalt/0またはwrite/1の代わりにトップレベルを使用することを好みます。したがって:

t2_t4(T2, T4) :- 
    Es = [ est(3,"J",3.1), est(6,"P",4.5), est(7,"L",2.0), est(4,"R",1.5), 
      est(2,"C",4.7), est(5,"F",2.0), est(9,"A",3.5), est(11,"K",4.8), 
      est(8,"M",2.4), est(15,"S",1.5), est(17,"D",0.5), est(19,"G",2.0) 
     ], 
    U is 2.0, 
    mayores(num(U), Es, T2), 
    menores(num(U), Es, T4). 

?- t2_t4(T2, T4). 
false. 

残念ながら、これは失敗します。障害の原因を減らすには、データのサイズと目標の数を減らします。だから、実際の問題はmenoresだけの要素が小さい場合のために定義されていることである

 
:- op(950, fy, *). 
*(_). 

menores(_, [], _/*[]*/). 
menores(num(U), [est(C2,N2,NT2)|T3], _/*[est(C2,N2,NT2)|T4]*/):- 
    U > NT2, 
    *menores(num(U),T3,T4). 

t2_t4(T2, T4) :- 
    Es = [ /* est(3,"J",3.1), est(6,"P",4.5), est(7,"L",2.0), est(4,"R",1.5), 
      est(2,"C",4.7), est(5,"F",2.0), est(9,"A",3.5), est(11,"K",4.8), 
      est(8,"M",2.4), est(15,"S",1.5), est(17,"D",0.5), */ 
      est(19,"G",2.0) 
     ], 
    U is 2.0, 
    * mayores(num(U), Es, T2), 
    menores(num(U), Es, T4). 

:私はで終了しました。等しいかそれ以上の場合menoresが失敗します。それを明示的に述べる必要があります。 mayoresと同じ引数です。なぜ両方を単一の述語に入れないのでしょうか? また、num/1を使用する必要はありません。

mayores_menores(_,[], [], []). 
mayores_menores(U,[E|Es],[E|Mays],Mens):- 
    E = est(_,_,NT), 
    U =< NT, 
    mayores_menores(U,Es,Mays,Mens). 
mayores_menores(U,[E|Es],Mays,[E|Mens]):- 
    E = est(_,_,NT), 
    U > NT, 
    mayores_menores(U,Es,Mays,Mens). 


t2_t4x(T2, T4) :- 
    Es = [ est(3,"J",3.1), est(6,"P",4.5), est(7,"L",2.0), est(4,"R",1.5), 
      est(2,"C",4.7), est(5,"F",2.0), est(9,"A",3.5), est(11,"K",4.8), 
      est(8,"M",2.4), est(15,"S",1.5), est(17,"D",0.5), est(19,"G",2.0) 
     ], 
    mayores_menores(2.0, Es, T2, T4). 
関連する問題