Visual Prolog: Задача работает не корректно
/* Ребёнок с родинкой?
А: Сколько полных лет каждому из ваших троих детишек? В: Произведение их возрастов равно 36. А: Этой информации мне мало. В: Сумма их возрастов равна номеру Вашего дома. А: Этой информации мне тоже недостаточно. В: У моего старшего ребенка - а он по крайней мере на год старше двух остальных - на левой руке родинка. А: Спасибо, теперь мне все ясно. Вашим детям ... лет. Что сказал А? */
DOMAINS
имя = первый; второй; третий
возраст, номер_дома = integer
структура_гипотезы = ребёнок(имя, возраст)
гипотеза = структура_гипотезы*
возрасты = возраст*
решение = возраст*
решения = решение*
constants
все_возрасты = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36]
predicates
nondeterm входит_в(структура_гипотезы, гипотеза)
nondeterm входит_в(возраст, возрасты)
nondeterm входит_в(решение, решения)
nondeterm генерация_гипотезы(гипотеза)
nondeterm условие(integer, гипотеза)
nondeterm проверка_гипотезы(гипотеза)
nondeterm гипотеза_в_решение(гипотеза, решение)
nondeterm старше(структура_гипотезы, структура_гипотезы)
nondeterm вставка(структура_гипотезы, гипотеза, гипотеза)
nondeterm сортировка_вставками(гипотеза, гипотеза, гипотеза)
nondeterm поиск_решения(решение)
nondeterm сумма_не_уникальна(integer,гипотеза)
nondeterm уникальная_сумма(integer,гипотеза)
nondeterm равны(гипотеза,гипотеза)
nondeterm убрать_повторы(решения, решения, решения)
nondeterm уникальные_решения(решения)
clauses
входит_в(ПервыйЭлемент, [ПервыйЭлемент|_ОстальныеЭлементы]).
входит_в(ПервыйЭлемент, [_ПервыйЭлемент|ОстальныеЭлементы]):-
входит_в(ПервыйЭлемент, ОстальныеЭлементы).
генерация_гипотезы(Гипотеза):-
входит_в(Возраст1, все_возрасты),
входит_в(Возраст2, все_возрасты),
входит_в(Возраст3, все_возрасты),
Гипотеза = [
ребёнок(первый, Возраст1),
ребёнок(второй, Возраст2),
ребёнок(третий, Возраст3)
].
% Произведение = 36.
условие(1, Гипотеза):-
входит_в(ребёнок(первый, Возраст1), Гипотеза),
входит_в(ребёнок(второй, Возраст2), Гипотеза),
входит_в(ребёнок(третий, Возраст3), Гипотеза),
Возраст1 * Возраст2 * Возраст3 = 36.
% Сумма возрастов это минимум дважды одно и то же число
условие(2, Гипотеза) :-
входит_в(ребёнок(первый, Возраст1), Гипотеза),
входит_в(ребёнок(второй, Возраст2), Гипотеза),
входит_в(ребёнок(третий, Возраст3), Гипотеза),
Сумма = Возраст1 + Возраст2 + Возраст3,
сумма_не_уникальна(Сумма, Гипотеза).
% Хотябы один ребёнок старше других на 1 год
условие(3, Гипотеза) :-
входит_в(ребёнок(первый, Возраст1), Гипотеза),
входит_в(ребёнок(второй, Возраст2), Гипотеза),
входит_в(ребёнок(третий, Возраст3), Гипотеза),
Возраст1 >= Возраст2 + 1, Возраст1 >= Возраст3 + 1.
% Предикат для проверки, что сумма возрастов не уникальна
сумма_не_уникальна(Сумма, Гипотеза):-
not(уникальная_сумма(Сумма, Гипотеза)).
% Предикат для проверки, что сумма возрастов уникальна
уникальная_сумма(Сумма, Гипотеза):-
генерация_гипотезы(Гипотеза1),
условие(1, Гипотеза1),
входит_в(ребёнок(первый, Возраст1), Гипотеза1),
входит_в(ребёнок(второй, Возраст2), Гипотеза1),
входит_в(ребёнок(третий, Возраст3), Гипотеза1),
Сумма1 = Возраст1 + Возраст2 + Возраст3,
Сумма1 = Cумма,
not(Гипотеза1 = Гипотеза).
равны([], []).
равны([H1|T1], [H2|T2]):-
H1 = H2,
равны(T1, T2).
проверка_гипотезы(Гипотеза):-
условие(1, Гипотеза),
условие(2, Гипотеза),
условие(3, Гипотеза).
старше(ребёнок(_, А), ребёнок(_, Б)):-
А > Б.
вставка(Элемент, [], [Элемент]).
вставка(Элемент, [Первый|Остальные], [Элемент, Первый|Остальные]):-
старше(Элемент, Первый).
вставка(Элемент, [Первый|Остальные], [Первый|ОстальныеСоВставкой]):-
NOT(старше(Элемент, Первый)),
вставка(Элемент, Остальные, ОстальныеСоВставкой).
сортировка_вставками([], СортированныйСписок, СортированныйСписок).
сортировка_вставками([Первый|Остальные], СортированнаяЧасть, СортированныйСписок):-
вставка(Первый, СортированнаяЧасть, СортированнаяЧастьСоВставкой),
сортировка_вставками(Остальные, СортированнаяЧастьСоВставкой, СортированныйСписок).
гипотеза_в_решение(Гипотеза, Решение):-
сортировка_вставками(Гипотеза, [], СортированнаяГипотеза),
СортированнаяГипотеза = [
ребёнок(_, Возраст1),
ребёнок(_, Возраст2),
ребёнок(_, Возраст3)
],
Решение = [Возраст1, Возраст2, Возраст3].
поиск_решения(Решение):-
генерация_гипотезы(Гипотеза),
проверка_гипотезы(Гипотеза),
гипотеза_в_решение(Гипотеза, Решение).
убрать_повторы([], Буфер, БезПовторов):-
БезПовторов = Буфер.
убрать_повторы([ПервыйЭлемент|ОстальныеЭлементы], Буфер, БезПовторов):-
входит_в(ПервыйЭлемент, Буфер),
убрать_повторы(ОстальныеЭлементы, Буфер, БезПовторов).
убрать_повторы([ПервыйЭлемент|ОстальныеЭлементы], Буфер, БезПовторов):-
NOT(входит_в(ПервыйЭлемент, Буфер)),
убрать_повторы(ОстальныеЭлементы, [ПервыйЭлемент|Буфер], БезПовторов).
уникальные_решения(Уникальные):-
findall(Решение, поиск_решения(Решение), ВсеРешения),
убрать_повторы(ВсеРешения, [], Уникальные).
goal
поиск_решения(Решения).
первое и третье условия работают корректно. проблема со вторым. помогите понять, где я допустил ошибку.