
- •Лекція 4.21. Логічні задачі
- •1. Проблема мавпи
- •2. Проблема фермера
- •3. Проблема слідчого
- •4. Поліцейська проблема
- •6. Маскарад
- •7. Таблиця велосипедних змагань
- •8. Студенти на велосипедах
- •10. Проблема мешканців острова
- •11. Проблема зебри.
- •12. Числовий ребус.
- •13. Ігрові програми. Гра "бики й корови" (видатний розум)
- •Висновки.
3. Проблема слідчого
Програма LOGTASK4 імітує дії слідчого, що розкриває по наявних фактах злочин - убивство громадянки Романової. У якості фактів описані дані про підозрюваних осіб (прізвище, вік, стать, професія), коло їх знайомств, перераховані всі можливі мотиви злочину й доказу. Правила, наведені в програмі, дозволяють на основі наявних фактів зробити висновок про ймовірного злочинця.
domains name,sex,occupation,object,vice,substance=symbol %ім'я,
%стать, професія, річь, порок, сутність age=integer predicates person(name, age, sex, occupation) had_affair(name, name) %любовна афера killed_with(name, object) % вбитий предметом killed(name) % вбитий killer(name) % вбивця motive(vice) % мотив(порок) smeared_in(name, substance) %забруднений чимось owns(name, object) %дехто володіє річчю operates_identically(object, object) %діє ідентично owns_probably(name, object) %можливо володіє suspect(name) %підозрює clauses person("Кузьмін", 55, m, "шофер"). person("Попов", 25, m, "футболіст"). person("Александров", 25, m, "продавець"). person("Іванов", 25, m, "безробітний"). person("Назарова",20, w, "покоївка"). person("Гущина", 22, w, "студент"). person("Романова", 19, w, "продавець").
had_affair("Назарова", "Іванов"). had_affair("Назарова", "Кузьмін"). had_affair("Романова", "Іванов").
killed_with("Романова", "готель").
killed("Романова").
motive("невідомий"). motive("гроші"). motive("ревнощі"). motive("помста").
smeared_in("Кузьмін", "плями крові"). smeared_in("Романова", "плями крові"). smeared_in("Попов", "бруд"). smeared_in("Іванов", "плями кави"). smeared_in("Гущина", "плями кави").
owns("Кузьмін", "ніж"). owns("Іванов", "пістолет").
operates_identically("ніж", "готель"). operates_identically("бар", "готель"). operates_identically("перукарня", "готель"). operates_identically("ножиці", "перукарня"). operates_identically("бутси", "готель").
owns_probably(X,"бутси"):-person(X,_,_,"футболіст"). owns_probably(X,"ножиці"):-person(X,_,_,"перукар"). owns_probably(X, Object) :- owns(X, Object).
suspect(X) :- motive("невідомий"), killed_with("Романова", Weapon), %Weapon - зброя operates_identically(Object, Weapon), owns_probably(X, Object). suspect(X) :- motive("ревнощі"), person(X, _, m, _), had_affair("Романова", X). suspect(X) :- motive("ревнощі"), person(X, _, f, _), had_affair(X, Man),had_affair("Романова", Man). suspect(X):-motive("гроші"),person(X,_,_, "безробітний").
killer(Killer) :- person(Killer, _, _, _), killed(Killed), Killed <> Killer, suspect(Killer), smeared_in(Killer, X), smeared_in(Killed, X). goal killer(Killer),nl, write("Злочин зробив : ",Killer).