Логическо програмиране
From Wikipedia, the free encyclopedia
Логическото програмиране е парадигма за програмиране, която се основава на принципите на формалната логика, анализ на предикатите и предикатното смятане.
Други свързани парадигми за програмиране са например императивното програмиране, структурно програмиране и функционалното програмиране.
Програмите, написани на език за логическо програмиране, представляват поредица от логически правила и факти. Основни езици за логическо програмиране са Prolog и Visial Prolog, ASP и Datalog.
Правилата са написани във формата на клаузи:
- H :- B1, ..., Bn.
Правилото има логически смисъл на импликация, която се чете „H е вярно, ако е вярно B1, ..., Bn“:
- H if B1 and ... and Bn.
Правилата имат глава (следствие) H и тяло (опашка, предпоставки) B1, ..., Bn. Правилата дават информация за условията, които са достатъчни за изпълняването на дадена връзка или свойство. Главата на правилото се състои от единствен атом и означава свойството или връзката, която ще е в сила, ако са изпълнени всички предпоставки на правилото. Тялото на правилото се състои от поредица от атоми. Знакът, разделящ тялото и главата, се чете „е вярно, ако“.
Фактите могат да се третират като правила без тяло, т.е. безусловни правила. Те имат следната форма:
- H.
В най-простия случай, когато H, B1, ..., Bn са атомарни формули, тези клаузи се наричат клаузи на Хорн. Съществуват редица вариации на този случай, например когато тялото е съставено от отрицанията на атомарни формули (отрицателни Хорнови клаузи).
В ASP и Datalog, програмите се характеризират само с декларативно четене и тяхното изпълнение се извършва с помощта на процедури за „доказателство“, чието поведение не е под контрола на програмиста. За разлика от това, в Пролог-базираните езици, програмите се характеризират с т.нар. процедурна интерпретация:
- за да се реши H, трябва да се реши B1 и ... и Bn.
Например нека имаме следната клауза:
- fallible(X) :- human(X).
базирана на пример, използван от Terry Winograd,[1] за да илюстрира програмния език Planner. Като клауза в една логическа програма може да се използва, както като процедура, която проверява дали X е склонен да греши, като се провери дали X е човек, така и като процедура за намирането на човек X, който е склонен на греши, чрез намирането на X, който да е човек. Дори фактите имат процедурна интерпретация. Например клаузата:
- human(socrates).
може да се използва едновременно като процедура, която показва, че socrates е човек, и като процедура, която намира X, който е човек, чрез определянето на socrates за човек.
Декларативното четене при програмите, написани на логически език за програмиране, може да се използва за проверка на коректността на програмата. Също така може да се използват техники за програмно трансформиране на една логически-базирана програма към друга такава, еквивалентна на нея, но по-ефективна. В Пролог-базираните логически езици може да се използва механизмът на изпълнение на програмата за подобряване на ефективността.