Помогите подправить задачку

  • Автор темы alex3820
  • Дата начала
A

alex3820

Пожалуйста помогите с задачкой

Дело де Роганов

Инспектора Крейга в срочном порядке пригласили посетить страну Трансильванию, с тем чтобы помочь в расследовании нескольких загадочных случаев, связанных с вампирами, или упырями. Одну часть населения Трансильвании составляют люди, а другую—упыри, причем люди всегда говорят правду, а упыри всегда лгут. Ситуация в этой стране крайне осложняется еще и тем, что половина всех жителей Трансильвании лишена рассудка и придерживается совершенно превратных представлений об окружающем их мире: так, все истинные суждения они считают ложными, а все ложные утверждения—истинными. Другая половина жителей психически здорова и абсолютно безупречна в своих суждениях, а именно: все истинные утверждения, по их мнению, являются истинными, про ложные же утверждения они знают, что те ложны.
Если трансильванец высказывает ложное суждение, то он может делать это как просто из заблуждения, так и умышленно. Люди в здравом уме и упыри, лишившиеся рассудка, изрекают только истины; люди, лишившиеся рассудка, и упыри, находящиеся в здравом уме, всегда лгут. К примеру, если вы спросите у жителя Трансильвании, круглая ли Земля (или она плоская), то человек в здравом уме, зная, что Земля круглая, так и скажет. Человек же, лишившийся рассудка, считает, что Земля не является круглой, и потому, правдиво высказывая свое мнение, будет утверждать, что Земля плоская. Упырь в здравом уме знает, что Земля круглая, но поскольку он всегда лжет, то будет говорить, что это вовсе не так. В то же время лишившийся рассудка упырь уверен, будто Земля плоская и поскольку он всегда лжет, то станет утверждать, что Земля круглая. Таким образом, ответы упыря, лишившегося рассудка, совпадают с высказываниями нормального человека, в то время как утративший разум человек будет отвечать на задаваемые ему вопросы точно так же, как и упырь, находящийся в здравом уме.
К счастью, оказалось, что Крейг разбирается в проблемах вампиризма не хуже, чем в логике. По прибытии Крейга в Трансильванию власти страны (среди которых были лишь люди в здравом рассудке) попросили его взять на себя разбор нескольких расследований.
В следующем расследовании оказались замешаны отец и сын де Роганы. При этом заранее было известно, что один из них – человек, а другой – упырь. Вот как выглядит запись беседы Крейга с ними.
Крейг (обращаясь к отцу). Вы оба в здравом уме или оба лишились рассудка? Или, может, вы отличаетесь друг от друга в этом отношении?

Отец. По крайней мере один из нас безумец.
Сын. Совершенно верно.
Отец. Но я-то, конечно, не упырь.
Кто из них является упырем?
______________________

Все работает, но мне надо заменить так, чтобы в первом высказывании(один из них явл психом) использовался предикат

_____________________
Код:
[codebox]domains
житель = житель(имя,состояние,род)
имя = symbol
состояние = symbol
род = symbol
семья = житель*
высказывание = высказывание(номер,имя)
номер = integer
predicates
nondeterm возможный_род(род)
nondeterm возможное_состояние(состояние)
nondeterm один_из(житель,семья)

nondeterm говорит_правду(житель)
nondeterm сказал(высказывание,семья)
nondeterm поиск_решений(семья)
nondeterm проверка_высказывания(номер,житель,семья)
nondeterm кто_упырь(имя)
clauses
%правила генерации гипотезы
один_из(X,[X|_]).
один_из(X,[_|T]):- один_из(X,T).


возможный_род(упырь).
возможный_род(человек).

возможное_состояние(нормальный).
возможное_состояние(псих).

%Отец. По крайней мере один из нас безумец.
сказал(высказывание(1,отец),[житель(отец,Состояние1,_),житель(сын,Состояние2,_)]
):-
Состояние1 = псих;Состояние2=псих.

%Сын. Совершенно верно.
сказал(высказывание(1,сын),Семья):-сказал(высказывание(1,отец),Семья).

%Отец. Но я-то, конечно, не упырь.
сказал(высказывание(2,отец),[житель(отец,_,Род1),житель(сын,_,_)]):-
not(Род1 = упырь).


%говрит правду
говорит_правду(житель(_,Состояние,Род)):-
Состояние=псих,Род=упырь;
Состояние=нормальный,Род=человек.

%проверка высказывания
проверка_высказывания(Номер,житель(Имя,Состояние,Род),Семья):-
говорит_правду(житель(Имя,Состояние,Род)),
сказал(высказывание(Номер,Имя),Семья);

not(говорит_правду(житель(Имя,Состояние,Род))),
not(сказал(высказывание(Номер,Имя),Семья)).

%поиск решения
поиск_решений(Семья):-
%При этом заранее было известно, что один из них - человек,
%а другой - упырь. Вот как выглядит запись беседы Крейга с ними.
возможный_род(Род1),
возможный_род(Род2),not(Род1=Род2),


возможное_состояние(Состояние1),
возможное_состояние(Состояние2),

Семья = [житель(отец,Состояние1,Род1),житель(сын,Состояние2,Род2)],

%проверка
проверка_высказывания(1,житель(отец,Состояние1,Род1),Семья),
проверка_высказывания(2,житель(отец,Состояние1,Род1),Семья),
проверка_высказывания(1,житель(сын ,Состояние2,Род2),Семья).

%кто является упырем
кто_упырь(Имя):-
поиск_решений(Семья),
один_из(житель(Имя,_,упырь),Семья).


goal
кто_упырь(Упырь).[/codebox]
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!