predicates
  nondeterm pet(symbol, symbol, symbol)
  nondeterm pedigree(symbol)
  nondeterm owns(symbol, symbol)
  nondeterm no_owner(symbol)

clauses
  pet("Кошка", "Бутси", "Коричневый").
  pet("Кошка", "Корни", "Черный"). 
  pet("Кошка", "Мак", "Рыжий"). 
  pet("Собака", "Флэш", "Пятнистый"). 
  pet("Собака", "Ровер", "Рыжий"). 
  pet("Собака", "Спот", "Белый").

  % Все животные, которыми владеют Том и Кейт, имеют родословные.
  pedigree(P):- owns("Том", P); owns("Кейт", P).
  
  % Том владеет всеми чёрными и коричневыми животными.
  owns("Том", P):- pet(_, P, "Черный"); pet(_, P, "Коричневый").
  
  % Кейт владеет всеми собаками небелого цвета, которые не являются собственностью Тома.
  owns("Кейт", P):- pet("Собака", P, C), C <> "Белый", not(owns("Том", P)).
  
  % Алан владеет Мак, если Кейт не владеет Бутси и если Спот не имеет родословной.
  owns("Алан", "Мак"):- not(owns("Кейт", "Бутси")), not(pedigree("Спот")).
  
  no_owner(P):- pet(_, P, _), not(owns(_, P)).
 
goal
  no_owner(P).