Программа "Подбор партнера" (рис. 2) демонстрирует использование правил для получения информации в результате поиска по образцу среди совокупности фактов. Эта программа является упрощенным прототипом программы для службы знакомств. Она содержит сведения о 7 мужчинах по параметрам: рост, цвет волос, класс машины. Единственным доменом программы является домен man.
/ * Программа: Подбор партнера */
/* Назначение: Демонстрация конструкции правила. */
domains
man = symbol
predicates
choice(man)
short _ height(man) /* мужчина низкого роста */
medium _ height(man) /* мужчина среднего роста */
tall _ height(man) /* мужчина высокого роста */
blасk _ hаir(mаn) /* мужчина - брюнет */
brown _ hair(man) /*мужчина - шатен */
blond _ hair(man) /* мужчина - блондин */
o1d _ car(man). /* владелец старого автомобиля */
new _ car(man) /* владелец нового автомобиля */
sports _ car(man) /* владелец спортивного автомобиля */
kathy _ choiсе(man)
who _ is _ the _ choiсе
goal
who _ is _ the _ choiсе.
clauses
/* факты */
сhоiсе(bill).
choice(jim).
choice(mark).
сhоiсе(robert).
сhоiсе(willy).
choice(tom).
choice(frank).
short _ height(bill).
short _ height(tom).
|
|
medium _ height(bill).
medium _ height(torn).
tall _ height(jim).
tall _ height(robert).
tall _ height(frank).
black _ hair(bill).
black _ hair(willy).
brown _ hair(j1m).
brown _ hair(tom).
blond _ hair(mark).
blond _ hair(robert).
blond _ hair(frank).
new _ car(bill).
new _ car(willy).
new _ car(frank).
old _ car(mark).
old _ car(tom).
sports _ car(jim).
sports _ car(robert).
/* правила */
who_is_the_choice:-
kathy_choice(Choice),
write("Kathy's choice is ".Choice,"."),
nl.
kathy_choice(Choice):-
choice(Choice),
tall_height(Choice),
blond_hair(Choice),
sports_car(Choice).
/***** конец программы *****/
Рис. 2. Программа "Подбор партнера"
В разделе clauses 7 утверждений предиката choice содержат имена bill, jim, mark, robert, willy, tom и frank. Утверждения с предикатами short_hair, medium_height, tall_height, black_hair, brownhair, blond_hair, new_car, old_car и sports_car также содержат эти мужские имена. Целью программы является отыскание мужчины, соответствующего вкусам некой kathy: высокого роста, блондина, обладателя спортивного автомобиля.
В случае обнаружения мужчины, обладающего перечисленными свойствами, программа должна напечатать его имя. Правилом для поиска служит
kathy_choice(Choice):-
choice(Choice),
tail_height(Choice),
blond_hair(Choice),
sports_car(Choice).
Назначение правила заключается в том, чтобы найти среди утверждений choice хотя бы один объект, который одновременно является объектом еще трех атрибутных утверждений: tall _ height, blond _ hair, sports _ car.Вначале данное правило присваивает переменной Choice значение одного из объектов утверждения choice. Как вы можете вспомнить из обсуждения утверждений likes, Турбо-Пролог просматривает утверждения с нужным предикатом, начиная с первого; следовательно, при первой попытке переменная Choice примет значение bill. Затем правило попытается найти соответствие этого значения одному из объектов утверждений первого из атрибутных предикатов, tall_height. Так как такого соответствия нет, то Турбо-Пролог откатывается к следующему утверждению choice и делает еще одну попытку. Теперь значением Choice становится jim. jim удовлетворяет запросу kathy, так как обладает высоким ростом, поэтому Турбо-Пролог пытается найти соответствие этого значения утверждениям blond_hair. Ввиду того, что эта попытка оканчивается неуспехом, весь процесс повторяется с третьим утверждением choice. Повторы будут происходить до тех пор, пока не будет найдено значение Choice, удовлетворяющее всем трем подцелям
|
|
tall _ height(Choice),
blond _ hair(Choiсе),
sports _ car(Choice).