Министерство образования и науки РФ Новосибирский государственный технический университет Кафедра экономической информатики Лабораторная работа №1 «Введение в Турбо-Пролог» Студенты: Мордвинов С.К. Пустосмехов В.А. Группа: ПМ-86 Преподаватель: Новосибирск 2010 Задание 1 Следующая программа представляет собой законченную программу Турбо-Пролога, служащую небольшим телефонным справочником. Так как используются только стандартные типы данных – секция domains в этой программе не нужна. predicates phone_number(symbol,symbol) clauses phone_number(“Albert”,”ETY-3665”) . phone_number(“Betty”,”555-5233”). phone_number(“Carol”,”909-1010”). phone_number(“Dororty”,”438-8400”). Наберите эту программу в окне редактора, запустите программу на выполнение, а затем по очереди задайте ей следующие вопросы: a. b. c. d. phone_number(“Carol”, Number) phone_number(Who,”438-8400”) phone_number(“Albert”, Number) phone_number(Who,Number) А программа-то нам и отвечает: a) Number=909-1010 1 Solution b) Who=Dororty 1 Solution c) Number=ETY-3665 1 Solution d) E;Test_Goal, pos: 55, 590 Nondeterministic clause: phone_number В этом случае, чтобы получить ответ, надо перед предикатом phone_number написать nondeterm, и тогда программа поймёт, что ответов может быть несколько, и выведет: Who=Albert, Number=ETY-3665 Who=Betty, Number=555-5233 Who=Carol, Number=909-1010 Who=Dororty, Number=438-8400 4 Solutions Теперь измените предложения. Предположим, что Kim и Dorothy имеют один и тот же номер телефона. Добавьте этот факт в секцию clauses и введите цель: phone_number(Who,”438-8400”) Если бы предикат phone_number не был определён как nondeterm, программа бы выдала ошибку, но она знает, что ответов может быть несколько и выводит: Who=Dororty Who=Kim 2 Solutions Задание 2 Наберите эту программу в окне редактора predicates isletter(char) clauses isletter(Ch): - 'a'<= Ch, Ch<='z'. isletter(Ch): - 'A'<=Ch, Ch<='Z'. Запустите программу и испытайте по очереди каждую из этих целей: a. isletter('x') b. isletter('2') c. isletter('hello') d. isletter(a) e. isletter(X) Определите декларативный смысл предложений. обрабатываются Турбо-Прологом. Объясните, почему некоторые цели не Программа отвечает: a) как и ожидалось, yes b) как и ожидалось, no c) E;Test_Goal, pos: 145, 11 Character constants must be terminated with an apostrophe (') Действительно, в предикате isletter аргумент должен быть символом, а мы дали строку d) E;Test_Goal, pos: 144, 512 Type error: Wrong object type Действительно, в предикате isletter аргумент должен быть символом, а мы дали неопределённую переменную e) E;Test_Goal, pos: 75, 707 Free variable in expression Действительно, свободная переменная в выражении – это как-то бессмысленно Задание 3 predicates can_buy(symbol,symbol) /* может купить*/ person(symbol) /*человек*/ car(symbol) /*машина*/ likes(symbol,symbol) /*нравится*/ for_sale(symbol) /*продается*/ clauses can_buy(Name, Model) : person(Name) and car(Name) and likes(Name, Model) and for_sale(Model). person (kelly). person (judy). car(lemon). car(hot_rod). likes(pizza, hot_rod). likes(judy, pizza). for_sale (pizza). for_sale (lemon). for_sale (hot_rod). Что могут купить Judy и Kelly? Они ничего не могут купить, т.к. для того, чтобы что-то купить, необходимо быть машиной, но ни Judy, ни Kelly – не машины. Если же исправить программу: predicates can_buy(symbol,symbol) /* может купить*/ person(symbol) /*человек*/ car(symbol) /*машина*/ likes(symbol,symbol) /*нравится*/ for_sale(symbol) /*продается*/ clauses can_buy(Name, Model) : person(Name) and car(Model) and likes(Name, Model) and for_sale(Model). person (kelly). person (judy). car(lemon). car(hot_rod). likes(pizza, hot_rod). likes(judy, pizza). for_sale (pizza). for_sale (lemon). for_sale (hot_rod). То всё равно ничего нельзя будет купить, т.к. никто не любит машины. Давайте исправим программу ещё раз: predicates can_buy(symbol,symbol) /* может купить*/ person(symbol) /*человек*/ car(symbol) /*машина*/ likes(symbol,symbol) /*нравится*/ for_sale(symbol) /*продается*/ clauses can_buy(Name, Model) : person(Name) and car(Model) and likes(Name, Model) and for_sale(Model). person (kelly). person (judy). car(lemon). car(hot_rod). likes(kelly, hot_rod). likes(judy, pizza). for_sale (pizza). for_sale (lemon). for_sale (hot_rod). Теперь, наконец, kelly может купить hot_rod Добавьте факты о стоимости машины и о текущих счетах в банке у Kelly, Judy и т.д. Измените правило покупки автомобиля с учетом этих фактов. Проверьте новую программу теми же вопросами, что и раньше. Пролог отвечает именно то, что вы и ждали? predicates nondeterm can_buy(symbol,symbol) /* ìîæåò êóïèòü*/ nondeterm person(symbol) /*÷åëîâåê*/ nondeterm car(symbol) /*ìàøèíà*/ nondeterm likes(symbol,symbol) /*íðàâèòñÿ*/ nondeterm for_sale(symbol) /*ïðîäàåòñÿ*/ nondeterm bank_account(symbol,integer) nondeterm costs(symbol,integer) nondeterm has_amount(symbol,integer) clauses has_amount(Name,Amount):-bank_account(Name,NameAmount) NameAmount>=Amount. and can_buy(Name, Model):person(Name) and car(Model) and likes(Name, Model) and for_sale(Model) and has_amount(Name,ModelAmount). person (kelly). person (judy). car(lemon). car(hot_rod). costs(hot_rod, 1000). bank_account(kelly, 1500). likes(kelly, hot_rod). likes(judy, pizza). for_sale (pizza). for_sale (lemon). for_sale (hot_rod). goal costs(Model,ModelAmount) and can_buy(kelly,What). Да, программа выдаёт то, что мы ожидаем: Kelly хочет hot_rod и имеет 1500, а он стоит 1000. Если же уменьшить размер банковского счёта Kelly до 500, купить hot_rod она не сможет. Задание 4 4. Данное задание выполните в Турбо-Прологе. Считая, что отношение РОДИТЕЛЬ определено как - РОДИТЕЛЬ(пам,боб). РОДИТЕЛЬ(том,боб). РОДИТЕЛЬ(том,лиз). РОДИТЕЛЬ(боб,энн). РОДИТЕЛЬ(боб,пат). РОДИТЕЛЬ(пам,джим). а) найдите, какими будут ответы на следующие вопросы: - РОДИТЕЛЬ(джим,Х) РОДИТЕЛЬ(Х,джим) РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,пат) РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,У). РОДИТЕЛЬ(У,джим) б) сформулируйте на Прологе следующие вопросы об отношении РОДИТЕЛЬ; - Кто родитель Пат? - Есть ли у Лиз ребенок? - Кто является родителем родителя Пат? в) Переведите следующие утверждения в правила на Прологе: - Всякий, кто имеет ребенка, - счастлив, введя одноаргументное отношение СЧАСТЛИВ. - Всякий X, имеющий ребенка, у которого есть сестра или брат, имеет двух детей, введя новое отношение ИМЕТЬ_ДВУХ_ДЕТЕЙ. - Определите отношение ВНУК (Х,У), используя отношение РОДИТЕЛЬ. - Определите отношение ТЕТЯ (Х,У) через отношения РОДИТЕЛЬ и СЕСТРА. Сформулируйте вопросы к вновь введенным правилам.