Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Контрольная работа

.doc
Скачиваний:
18
Добавлен:
02.05.2014
Размер:
47.62 Кб
Скачать

Задание

(Полицейская головоломка)

Написать программу 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