Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ОЛП.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
353 Кб
Скачать
☆

23. Декларативные и процедурные элементы Турбо-Пролога. Примеры применения в логической программе.

Одной из основных тенденций развития компьютерной техники является максимальное освобождение пользователей от непосредственного программирования решения задач за счет передачи этих функций компьютеру.

В настоящее время это делается различными подходами: в рамках традиционного программирования и в рамках научного направления, называемого искусственным интеллектом.

В рамках традиционного программирования это делается множеством способов: применением стандартных библиотек, позволяющих автоматизировать некоторые процедуры программирования, визуальными и инструментальными средствами, позволяющими автоматизировать процесс разработки программных интерфейсов, компонентными технологиями и тому подобное.

Второе направление основано на формализации знаний и применении достижений и средств математической логики. В рамках этого направления развивается совершенно другой подход к программированию, называемый декларативным или логическим, в отличие от первого - процедурного.

Принципиальным отличием декларативного программирования от процедурного является то, что в случае процедурного программирования пользователь сам конструирует процесс решения задачи в виде алгоритма, а в случае декларативного программирования основным моментом является формализованное описание некоторой предметной области в виде базы знаний, из которой требуемое решение задачи формально выводится в виде некоторого следствия из неё. Такая база знаний должна состоять из истинных утверждений для заданной предметной области. Таким образом, если база знаний описана достаточно полно, то задача пользователя решается автоматически за счет механизмов формального вывода и нет необходимости детально конструировать процесс ее решения.

Ключевым моментом декларативного или логического программирования является формализация знаний на основе механизмов логического вывода. Человек получает знания в самых различных формах. Это могут быть изображения, схемы, чертежи, таблицы, документы, факты, методы, алгоритмы, законы, правила и тому подобное. В более абстрактной форме все эти формы знаний можно представить в виде понятийных, конструктивных (описание строения объекта, его структуры и взаимосвязи элементов) и процедурных. Ещё в более абстрактной форме их можно свести в две группы знаний: процедурные и декларативные. Первые описывают предметную область, а вторые описывают процедуры решения задач.

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

1) grandfather(misha, ania):- father(misha, nina), mother(nina, ania)

2) parent(X, Y):- mother(X, Y); father(X, Y)

grandfather(X, Y) :- father(X, Z), parent(Z, Y)

24. Организация ветвлений и циклов в программе. Рекурсии. Прямая и обратная рекурсии. Примеры.

Под рекурсией понимается применение правила в самом теле этого же правила.

Общую схему применения рекурсии можно пояснить записью:

recrule(X,Y,..., Z) :- fact1( ), rule1( ),..., factk( ), rulek( ), recrule(X1,Y1,...,Z1)

В теле этого правила содержатся различные факты и правила, а также обращение к самому себе, но с другими значениями некоторых или всех его аргументов.

Рекурсии в логических программах широко используются для организации циклической обработки данных. pr_rec([x|t]):-write(x),nl,pr_rec(t). ob_rec([x|t]):-ob_rec(t),write(x),nl

Задача: Просуммировать k раз заданное число n.

domains k = integer s, n = real

predicates summa( s, n, k )

clauses

summa( S, N, K) :- K>0, K1 = K - 1, S1= S+N, summa( S1, N, K1).

summa( S, N, K) :- K=0, write( "сумма =", S).

Пусть n=5.6 , k=10.

При запуске этой программы в окне ввода целей на запрос goal: вводится запрос summa(0,5.6,10), где 0 - это начальное значение суммы, 5.6 - суммируемое число, а 10 - кратность суммирования.

С помощью первого правила выполняется цикл суммирования, в результате которого вычисляется сумма. В конце цикла значение переменной К становится равной нулю, что делает истинным второе правило, с помощью которого выводится результат.

domains

x = integer

predicates

factorial1(x,x) // на обратном ходе

factorial2(x,x) // на прямом ходе

stepen1(x,x,x)

stepen2(x,x,x)

clauses

factorial1(0,1).

factorial1(X,Y):- X>0,X1=X-1,factorial1(X1,Y1),Y=Y1*X.

stepen1(_,0,1).

stepen1(X,K,S):- K>0,K1=K-1,stepen1(X,K1,S1),S=S1*X.

factorial2(X,Y):- X>0,Y1=Y*X,X1=X-1, factorial2(X1,Y1).

factorial2(X,Y):- X=0,write("F=",Y).

stepen2(X,K,S):- K>0,S1=S*X,K1=K-1,stepen2(X,K1,S1).

Stepen2(X,K,S):- K=0,write("S=",S).

Результат: Factorial1(7,X) X=5040 Factorial1(3,6) Yes Factorial2(7,1) F=5040 Yes

Stepen1(2,7,X) X=128 Stepen1(2,7,128)Yes Stepen2(2,7,1) S=128 Yes