ЯЗык "Пролог". Понятие базы знаний, определение. Задачи и упражнения, страница 8


проверка(число, число)

CLAUSES сумма(Руб1рКоп1,Руб2,Коп2,Руб,Коп):проверка(Коп1 ,Коп2),

Коп1+Коп2<100,

Руб=Руб1+Руб2,

Коп=Коп1+Коп2 сумма(Руб1,Коп1тРуб2,Коп2,Руб,Коп):проверка(Коп1,Коп2),

Руб=Руб1+Руб2+1,

Коп=Коп1+Коп2-100. проверка(Коп1,Коп2):-КопК100, Kdn2<100, Коп1>=0, Коп2>=0

4.3. Примеризгеометрии: Базазнаний«Треугольники»

Язык Пролог позволяет создавать базы знаний, при помощи которых можно решать задачи из различных предметных областей. Рассмотрим базу знаний из геометрии. В ней записаны сведения о некоторых геометрических фигурах. Требуется проверить, какие из этих фигур являются треугольниками. Назовем эти фигуры «кандидатами» (в том смысле, что это пока только кандидаты в треугольники. Тогда факты можно записать в виде:

кандидат(<имя>,<1-ясторона>,<2-исторона>,<3-ясторона>).

Например, факты могут быть такими1

кандидат(авс,3,4,5).

кандидат(с!ет,7,15,11).

кандидат(тпр,4,3,8).

Чтобы определить, является ли наш «кандидат» треугольником,


надо проверить, удовлетворяют ли его стороны неравенству треугольника: «сумма двух любых сторон треугольника должна быть больше третьей стороны» Если описать это соотношение математически, то для всех возможных сочетаний сторон получим три неравенства:

a+t»c, a+c>b, b+c>a.

Чтобы не проверять все эти неравенства, можно «усовершенствовать» неравенство треугольника. Действительно, если сравнить наиболее длинную сторону (или одну из них, если треугольник равнобедренный) с суммой двух других сторон, то выполнение неравенства для остальных троек очевидно. Значит, нам потребуется правило для определения самой длинной стороны (или максимума из трех чисел). Мы можем определить максимум из двух чисел:

Га, при a>b                                a

max(a.b) =                                                       -------- >        max

|_b, при a<b                               b                              --------- >

-- >

Имея правила для определения максимума из двух чисел, можно найти максимум из трех, используя вспомогательную переменную. Способ определения поясним схемой:

а        1

ь

с

=> т = тах(а,Ь,с)

тах(а

,b)=d

!

d

с

1

max(d,c)=rn

Правило на Прологе будет выглядеть так:

max3(A,B.C,M):-max(A,B.D), max(D,C,M).

Тогда для того, чтобы определить, является ли данный «кандидат» треугольником, можно написать правило, проверяющее вы-


полнение неравенства треугольника: треуг(Имя):-кандидат(Имя,А,В,С), тахЗ^.В.С.М), А+В+С-М>М.

(Чтобы не выяснять, какая именно сторона самая длинная, тем более, что нас интересует только ее длина и сумма длин двух остальных, мы вычисляем сумму длин всех сторон, а затем вычитаем самую длинную). Теперь можно проверить, какие из наших «кандидатов» являются треугольниками. Для проверки можно задавать вопросы вида:

Цель: треуг(аЬс)

Машина будет отвечать «Да» или «Нет».

Теперь можно научить машину определять вид треугольника по его сторонам. Для прямоугольного треугольника можно использовать теорему Пифагора: а222. Напишем отдельное правило для вычисления квадрата числа (a2=b):

квадрат(А,В)>В=А*А.

Правило для определения прямоугольного треугольника будет таким:

прямоуг(Имя):- кандидат(Имя,А,В,С), max3(A,B,C,D), квад-paT(D,P), квадрат(А,А2), квадрат(В,В2), квадрат(С,С2), К=А2+В2+С2, L=K-P, not(P<>L).

Для определения суммы квадратов использован тот же прием, что и в правиле «треуг».

Для тупоугольного и остроугольного треугольника можно использовать теорему косинусов: с2 = а2+ Ь2- 2*a*b*cos(alfa), где alfa