Ответ в теме: Visual Prolog 5.2 логическая задача "На выставке собак"

      Комментарии к записи Ответ в теме: Visual Prolog 5.2 логическая задача "На выставке собак" отключены
#2767

Эта часть правильная (только чуть-чуть упростил):

имя(энди). 
имя(билл). 
имя(николас). 
имя(дональд).

порода(лабрадор). 
порода(дог). 
порода(далматин).

кличка(X):-
  имя(X).

Дальше Вам нужно сгенерировать клички и породы:

кличка(КличкаПесЭнди_1).
кличка(КличкаПесЭнди_2).
порода(ПородаПесЭнди_1).
порода(ПородаПесЭнди_2).
% и так далее 

Затем объединить их в список:

Генерация = [
  имя_порода_кличка(энди, ПородаПесЭнди_1, КличкаПесЭнди_1),
  имя_порода_кличка(энди, ПородаПесЭнди_2, КличкаПесЭнди_2)
].

И после этого, добавлять условия. Ваши условия я не смог понять (по крайней мере некоторые). Если вы уже сейчас запустите программу – получите множество вариантов решения, но с каждым условием оно будет сокращаться.
Например, для условия: “Из восьми собак было три лабрадора, три дога и два далматинца.” вы можете использовать функцию count:

count(Генерация, имя_порода_кличка(_, лабрадор, _), 3),
count(Генерация, имя_порода_кличка(_, дог, _), 3),
count(Генерация, имя_порода_кличка(_, далматин, _), 2).

Для следующего: “Никто из братьев не держит двух собак одной породы.” – я бы написал отдельное правило:

не_держит_собак_одной_породы(Генерация):-
  member(имя_порода_кличка(Имя, Порода, Кличка_1)),
  member(имя_порода_кличка(Имя, Порода, Кличка_2)),
  NOT(Кличка_1 = Кличка_2), !, fail.
не_держит_собак_одной_породы(Генерация).

Тут мы выбираем из списка при помощи функции member двух собак одного владельца (Имя в обоих вызовах будет связано с одним значением) и одной породы. Проверяем, чтобы это были разные собаки – у них разные клички. Если нам это удалось – выполняем отсечение для запрета поиска других решений и fail для завершения текущего решения неудачей. Если не удалось – то текущая Генерация не содержит братьев с собаками одной породы.

Остальные правила проще и пишутся по аналогии. Попробуйте, если будут вопросы – задавайте.