Контрольная работа
.docЗадание
(Полицейская головоломка)
Написать программу Prolog для решения следующей полицейской головоломки. Jean был убит во вторник. Luc, Paul, Alain, Bernard и Louis находятся под подозрением.
Известно что:
- убийцей является тот, кто желал смерти Jean-a, имеет оружие и не имеет алиби на вторник;
- алиби представленное персоной не внушающей доверия не является действительным;
- кто-то мог хотеть смерти Jean-a, если он был заинтересован в его смерти или желал ему отомстить;
- персона модет быть заинтересована в смерти Jean-a, если она наследует его собственность, если должна ему денег или была замечена Jean-ом на месте преступления.
Анкета дала следующие результаты:
- У Luc-a есть алиби на вторник, которое предоставил Bernard;
- У Paul-a есть алиби на вторник, которое предоставил Bernard;
- У Louis-a есть алиби на вторник, которое предоставил Luc;
- У Alain -a есть алиби на четверг, которое предоставил Luc;
- Alain персона не внушающее доверие;
- Paul хотел отомстить Jean-у;
- Luc хотел отомстить Jean-у;
- Bernard является наследником Jean-a;
- Jean является наследником Louis -a;
- Louis должен денег Jean-у;
- Luc должен денег Jean-у;
- Jean видел Alain –a за совершением преступления;
- У Luc-а есть оружие;
- У Louis -а есть оружие;
- У Alain -а есть оружие.
Кто убийца?
Листинг программы (i):
predicates
person(symbol, symbol).
person(symbol,symbol,symbol).
j_s(symbol).
z_s(symbol).
alibi(symbol).
killer(symbol).
goal
killer(X),
write("KILLER -",X), nl.
clauses
person(alain, prest). /* Jean видел Alain –a за совершением преступления */
person(louis,money). /* Louis должен денег Jean-у */
person(luc,money). /* Luc должен денег Jean-у */
person(paul, mesti). /* Paul хотел отомстить Jean-у */
person(luc, mesti). /* Luc хотел отомстить Jean-у */
person(luc, w). /* У Luc-а есть оружие */
person(alain, w). /* У Alain -а есть оружие */
person(louis, w). /* У Louis -а есть оружие */
person(alain, non). /* Alain персона не внушающее доверие */
person(luc,tuesday,bernard). /* У Luc-a есть алиби на вторник, которое предоставил Bernard */
person(paul,tuesday,bernard). /* У Paul-a есть алиби на вторник, которое предоставил Bernard */
person(louis,tuesday,luc). /* У Louis-a есть алиби на вторник, которое предоставил Luc */
person(alain,thursday,luc). /* У Alain -a есть алиби на четверг, которое предоставил Luc */
person(jean, hear, louis). /* Jean является наследником Louis -a */
person(bernard, hear, jean). /* Bernard является наследником Jean-a */
killer(X) :- j_s(X), person(X,w), not(alibi(X)).
alibi(X) :- person(X,tuesday,_), person(_,tuesday,X); not(person(X,non)).
j_s(X):- z_s(X); person(X, mesti).
z_s(X):- person(X, hear, jean).
z_s(X):- person(X,money); person(X, prest).
РЕЗУЛЬТАТ:
KILLER - alain
Листинг программы (ii):
domains
name, day = symbol
predicates
person(name).
alibi(name,day,name).
persona_non(name).
mesti(name).
heir(name,name).
money(name).
jean_see(name).
weapon(name).
motive(name).
n_al(name).
killer(name).
goal
killer(X),
write("KILLER -",X), nl.
clauses
person(jean).
person(luc).
person(paul).
person(alain).
person(bernard).
person(louis).
alibi(luc,tuesday,bernard). /* У Luc-a есть алиби на вторник, которое предоставил Bernard */
alibi(paul,tuesday,bernard). /* У Paul-a есть алиби на вторник, которое предоставил Bernard */
alibi(louis,tuesday,luc). /* У Louis-a есть алиби на вторник, которое предоставил Luc */
alibi(alain,thursday,luc). /* У Alain -a есть алиби на четверг, которое предоставил Luc */
persona_non(alain). /* Alain персона не внушающее доверие */
mesti(paul). /* Paul хотел отомстить Jean-у */
mesti(luc). /* Luc хотел отомстить Jean-у */
heir(bernard,jean). /* Bernard является наследником Jean-a */
heir(jean,louis). /*Jean является наследником Louis -a */
jean_see(alain). /* Jean видел Alain –a за совершением преступления */
money(louis). /* Louis должен денег Jean-у */
money(luc). /* Luc должен денег Jean-у */
weapon(luc). /* У Luc-а есть оружие */
weapon(louis). /* У Louis -а есть оружие */
weapon(alain). /* У Alain -а есть оружие */
n_al(X) :- not(alibi(X,tuesday,_)); not(alibi(_,tuesday,X)); persona_non(X).
motive(X) :- mesti(X); heir(X,_); jean_see(X); money(X).
killer(X) :- motive(X), weapon(X), n_al(X).
РЕЗУЛЬТАТ:
KILLER - alain