2017-04-18 40 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時它給了我這個錯誤。目標(指令)失敗:用戶:主要序言swi

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

您正在使用'mayores'和'may' ... – false

回答

3

首先,喜歡使用頂級代替在你的程序halt/0write/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. 

不幸的是,這失敗了。爲了減少失敗的根源,減少數據量和目標數量。我收於:

 
:- 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只對其中的元素小的情況下定義。如果他們相同或更大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).