Цель (директива) не выполнена: пользователь: основной пролог swi

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.

Goal (directive) failed: user:main.

1 ответ

Прежде всего, предпочитайте использовать верхний уровень вместо 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.

К сожалению, это не удается. Чтобы уменьшить источник сбоя, уменьшите размер данных и количество целей. Я закончил в:

: - op (950, фу, *).
*(_).

Меноры (_, [], _ / *[]* /).
menores (num (U), [est (C2, N2, NT2) | T3], _ / *[est (C2, N2, NT2) | T4]* /): -
    U> NT2,
    * Меноры (число (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,"Г", 2,0)
      ],
   U составляет 2,0,
   * майоры (число (U), Es, T2), 
   Меноры (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).
Другие вопросы по тегам