:- discontiguous task_info/0. vessels([бутылка, стакан, кувшин, банка]). liquids([молоко, лимонад, квас, вода]). index_of([H|_], H, 1) :- !. index_of([_|T], X, I) :- index_of(T, X, I1), I is I1 + 1. adjacent(I, J) :- J is I + 1 ; I is J + 1. between_pos(Mid, Left, Right) :- (Mid > Left, Mid < Right) ; (Mid < Left, Mid > Right). solve_puzzle(Solution) :- vessels(VNames), liquids(Ls), % Перестановка судов и жидкостей по позициям 1..4 permutation(VNames, [V1, V2, V3, V4]), permutation(Ls, [L1, L2, L3, L4]), Solution = [(V1,L1),(V2,L2),(V3,L3),(V4,L4)], Vessels = [V1,V2,V3,V4], Liquids = [L1,L2,L3,L4], % Условие 1: Вода и молоко не в бутылке ( V1 = бутылка -> (L1 \= вода, L1 \= молоко) ; true), ( V2 = бутылка -> (L2 \= вода, L2 \= молоко) ; true), ( V3 = бутылка -> (L3 \= вода, L3 \= молоко) ; true), ( V4 = бутылка -> (L4 \= вода, L4 \= молоко) ; true), % Условие 2: Сосуд с лимонадом находится между кувшином и сосудом с квасом index_of(Vessels, кувшин, JugPos), index_of(Liquids, лимонад, LemonPos), ( (L1 = квас, KvassPos = 1) ; (L2 = квас, KvassPos = 2) ; (L3 = квас, KvassPos = 3) ; (L4 = квас, KvassPos = 4) ), between_pos(LemonPos, JugPos, KvassPos), % Условие 3: В банке — не лимонад и не вода ( V1 = банка -> (L1 \= лимонад, L1 \= вода) ; true), ( V2 = банка -> (L2 \= лимонад, L2 \= вода) ; true), ( V3 = банка -> (L3 \= лимонад, L3 \= вода) ; true), ( V4 = банка -> (L4 \= лимонад, L4 \= вода) ; true), % Условие 4: Стакан находится около банки и сосуда с молоком index_of(Vessels, стакан, GlassPos), index_of(Vessels, банка, JarPos), ( (L1 = молоко, MilkPos = 1) ; (L2 = молоко, MilkPos = 2) ; (L3 = молоко, MilkPos = 3) ; (L4 = молоко, MilkPos = 4) ), adjacent(GlassPos, JarPos), adjacent(GlassPos, MilkPos). pretty_print_solution(Solution) :- write('Решение (слева направо):'), nl, forall(member((V,L), Solution), (write(' '), write(V), write(' — '), write(L), nl)). solve_and_print :- findall(S, solve_puzzle(S), Sols), forall(member(S, Sols), (pretty_print_solution(S), nl)). task_info :- write('Логическая задача о четырех сосудах и четырех жидкостях.'), nl, write('Вызовите solve_and_print. Или solve_puzzle(Solution).'), nl. show_examples :- write('Примеры запросов:'), nl, write('?- solve_puzzle(S), pretty_print_solution(S).'), nl, write('?- solve_and_print.'), nl.