Ответ в теме: 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 для завершения текущего решения неудачей. Если не удалось — то текущая Генерация не содержит братьев с собаками одной породы.

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