/*
  Предположим, что обитатель был лжецом.
  Тогда его утверждение должно быть ложным. Значит, он когда-то делал такое утверждение.
  Если он действительно не делал такого утверждения, он - рыцарь.
  Поскольку золото действительно оказалось на острове, обитатель сказал правду. Значит, обитатель - рыцарь.
*/

predicates
  gold
  stated(symbol)
  nondeterm check(symbol)
  nondeterm find(symbol)
  nondeterm human(symbol, symbol)
  
clauses
  gold.
  stated("Рыцарь"):- fail.
  stated("Лжец").

  human("Обитатель","Рыцарь").
  human("Обитатель","Лжец").
  
  /* Рыцарь не говорил, что золото есть, либо сказал, и оно оказалось */
  check("Рыцарь"):- not(stated("Рыцарь")); stated("Рыцарь"), gold.
  /* Лжец сказал, что золото есть, и его не оказалось */
  check("Лжец") :- stated("Лжец"), not(gold).

  find(T):- human("Обитатель", T), check(T).

goal
  find(T).