Распределить числа от 1 до n по трем коробкам A, B, C, таким образом, чтобы выполнялись следующие условия - Prolog
Формулировка задачи:
Распределить числа от 1 до n по трем коробкам A, B, C, таким образом, чтобы выполнялись следующие условия:
- в коробке А могут находиться только четные числа;
- в коробке B могут находиться только нечетные числа;
- если число i находится в некоторой коробке, тогда число k=2*i (k≤n), не может находиться в этой же коробке.
Решение задачи: «Распределить числа от 1 до n по трем коробкам A, B, C, таким образом, чтобы выполнялись следующие условия»
textual
Листинг программы
fill_boxes(N, A, B, C) :- retractall( filled_boxes(_, _, _) ), make_nums(N, Ns), permutation(Ns, Ns1), fill_boxes(Ns1, [], [], [], A, B, C), not( filled_boxes(A, B, C) ), assertz( filled_boxes(A, B, C) ). fill_boxes(Ns, A0, B0, C0, A, B, C) :- fill_boxes_(Ns, A0, B0, C0, A, B, C), !. fill_boxes_([], A, B, C, A, B, C). fill_boxes_(Ns, A, B, C, A2, B2, C2) :- inc_box(a, Ns, Ns1, A, A1), inc_box(b, Ns1, Ns2, B, B1), inc_box(c, Ns2, Ns3, C, C1), fill_boxes_(Ns3, A1, B1, C1, A2, B2, C2). inc_box(Nick, Ns, Ns1, Box, [N | Box]) :- select(N, Ns, Ns1), check_num_nick(Nick, N), check_num(N, Box). inc_box(_, Ns, Ns, Box, Box). check_num_nick(a, N) :- N mod 2 =:= 0. check_num_nick(b, N) :- N mod 2 =:= 1. check_num_nick(c, _). check_num(N, Box) :- member(N1, Box), N1 is 2 * N, !, fail. check_num(_, _). make_nums(N, [N | Ns]) :- N > 0, N1 is N - 1, !, make_nums(N1, Ns). make_nums(_, []).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д