and for_sale(Model)

advertisement
Министерство образования и науки РФ
Новосибирский государственный технический университет
Кафедра экономической информатики
Лабораторная работа №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, имеющий ребенка, у которого есть сестра или брат,
имеет
двух
детей,
введя
новое
отношение
ИМЕТЬ_ДВУХ_ДЕТЕЙ.
- Определите отношение ВНУК (Х,У), используя отношение РОДИТЕЛЬ.
- Определите отношение ТЕТЯ (Х,У) через отношения РОДИТЕЛЬ
и СЕСТРА.
Сформулируйте вопросы к вновь введенным правилам.
Download