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 
    поиск_решения(Решения).

первое и третье условия работают корректно. проблема со вторым. помогите понять, где я допустил ошибку.


Ответы (0 шт):