пятница, 10 июля 2009 г.

Решение задач в Прологе

Лабораторная работа №2
Решение задач в Прологе

1. (о бездомном животном) Бутси – коричневая кошка. Корни – черная кошка. Мак – рыжая кошка. Флэш, Ровер, Спот – собаки, Ровер – рыжая, а Спот – белая. Все животные, принадлежащие Тому и Кейт, имеют родословную. Том владеет всеми черными и коричневыми животными. Хозяин всех собак небелого цвета, которые не являются собственностью Тома, – Кейт. Алан владеет Мак, если Бутси не принадлежит Кейт и если Спот – без родословной. Флэш – пятнистая собака. У каких животных нет хозяев?
Рекомендуется использовать предикаты:
• cat(X) {X – кошка}
• dog(X) {X – собака}
• color (X, Y) {X имеет цвет Y}
• master(X, Y) {X – хозяин Y}
• rod(X) {X имеет родословную}
• animal(X) {X – животное}


2. (о фирме) Дан фрагмент программы на Прологе, в которой хранятся сведения о работниках фирмы.

Predicates
???
Clauses
worker (barbara).
worker (john).
worker (charles).
worker (diana).

money (barbara, 500).
money (john, 200).
money (charles, 210).
money (diana, 150).

boss (barbara, john).
boss (john, charles).
???
Goal
???

Предикаты в программе переводятся так:
• worker(X) {X – работник}
• money (X, Y) {X получает зарплату в размере Y}
• boss(X, Y) {X – непосредственный руководитель Y}

Постройте с их помощью правила для следующих новых предикатов:
• below(X, Y) {X – подчинённый Y}
• middle(X) {X – одновременно руководитель и подчинённый}
• near(X, Y) {X и Y находятся рядом по служебной лестнице,
то есть либо первый начальник второго, либо наоборот}
• bigMoney(X) {X получает хорошую зарплату, больше 200}
• more(X, Y) {зарплата у X больше, чем у Y}
• happyWorker(X) {X получает больше своего начальника}

В разделе запросов спросите у Пролога:
• Руководителем Джона является Чарльз?
• Кто является подчинённым Барбары?
• Кто является руководителем?
• Кто никем не руководит?
• У кого из работников зарплата больше, чем 300?
• Какой работник самый высокооплачиваемый?
• Кто является главным руководителем?

Что означают следующие запросы? Какие ответы на них выдаст Пролог?
• money(barbara, 500).
• bigMoney(_).
• near(john,Y), happyWorker(Y).
• worker(X), not(boss(X,_)), not(below(X,_)).
• worker(X), not(more(X,_)), money(X,M).
• boss(X,charles), money(X,M).
• worker(X), not(middle(X)).
• below(X,_), not(below(_,X)).
• worker(X), not(more(X,_)).

3. (о чём-то) Сформулируйте задачу, которую решает программа long_novel. pro. Объясните, как Пролог находит решение (к каким предикатам происходит обращение, какие значения принимают переменные).

4. (об автомобилях) Составьте программу, в которой хранятся данные об автомобилях некоторого магазина (марка, год выпуска, цвет, цена). Например,
car (ferrari, 2001, red, 2000).
car (bmv, 2000, black, 3500).
car (mustang, 1995, brown, 2500).
car (reno, 2002, darkBlue, 4000).
car (volvo, 1981, white, 1500).
car (zapor, 1981, yellow, 150).
car (volga, 1981, grey, 500).
car (audi, 2006, red, 5000).
car (mersedes, 2006, blue, 7000).
car (ford, 2006, green, 9000).
Найдите:
• все автомобили красного цвета, выпущенные не ранее 2000 года и ценой не более 2000;
• все автомобили, новее, но дешевле мустанга;
• самую старую машину;
• самую дорогую;
• самую новую;
• самую дешёвую.

5. (о вреде пива!) Пусть заданы четыре предиката:

drinker(X) {X - любитель выпить}
go(X, B) {X посещает бар B}
give(B, P) {в баре B подают пиво сорта P}
like(X, P) {X нравится пиво P}

Постройте с их помощью правила для следующих новых предикатов:

• goodBar(X, B) {если X- любитель выпить, ходит в бар B, и там есть хотя бы один сорт пива,
которое ему нравится}
• badBar(X, B) {если X- любитель выпить, ходит в бар B, но там нет ни одного сорта пива,
которое ему нравится}
• happyDrinker(X) {если пиво, которое предпочитает любитель выпить X, подают, по крайней
мере, в одном из баров, которые он посещает}
• deadDrinker(X) {если в любом из баров, которые посещает любитель выпить X, подают
подходящее пиво}

Проверьте свои правила, записав несколько фактов о том, кто какой бар посещает и что предпочитает.


6. (о числах) Имеется шесть четырёхзначных чисел. Найдите всевозможные цепочки, содержащие все эти числа, такие, что последняя цифра предыдущего числа совпадает с первой цифрой следующего.
Код решения:
Predicates
number (integer)
solve (integer, integer, integer, integer, integer, integer)

Clauses
% перечисляем данные числа
number (7013).
number (9532).
number (2084).
number (4237).
number (3569).
number (2374).
% цепочка X1,X2,X3,X4,X5,X6 является решением, если X1,X2,X3,X4,X5,X6 – различные числа из нашего набора, и каждый раз последняя цифра предыдущего числа совпадает с первой цифрой следующего
solve(X1,X2,X3,X4,X5,X6):-
number(X1), number(X2), X2<>X1, X1 mod 10= X2 div 1000,
number(X3), X3<>X1,X3<>X2, X2 mod 10= X3 div 1000,
number(X4), X4<>X1,X4<>X2,X4<>X3, X3 mod 10= X4 div 1000,
number(X5), X5<>X1,X5<>X2,X5<>X3,X5<>X4, X4 mod 10= X5 div 1000,
number(X6), X6<>X1,X6<>X2,X6<>X3,X6<>X4,X6<>X5, X5 mod 10= X6 div 1000.
Goal
solve(X1,X2,X3,X4,X5,X6).

Здесь (как и в любой из уже решённых задач) мы описали только то, что дано и что найти, но не как находить. Это берёт на себя Пролог. На Паскале пришлось бы, кроме данных и результата, прописывать и алгоритм решения (который, конечно, нужно было бы сначала придумать и затратить на это время). В этом и состоит отличие декларативных языков программирования (типа Пролога) от императивных (типа Паскаля).
• Объясните, как Пролог находит решение в этой задаче.
• В разделе Goal cпросите, есть ли цепочка, которая начинается, например, с числа 7013.

7. (о враждующих рыцарях) Однажды мажордом короля Артура обнаружил, что к обеду за круглым столом приглашено 6 рыцарей (a, b, c, d, e, f). При этом пары рыцарей a и b, c и d, e и f, b и e враждовали друг с другом. Определите все способы рассадки рыцарей такие, чтобы никакие два врага не сидели рядом?

Отличный Справочник по фирмам - полная информация