Логическо програмиране: Разлика между версии
Изтрито е съдържание Добавено е съдържание
м без двоеточие в заглавие на раздел |
Редакция без резюме |
||
Ред 1:
'''Логическото програмиране''' е [[парадигма за програмиране]], която се основава на принципите на [[формална логика|формалната логика]] и [[предикатно смятане|предикатното смятане]].
Други парадигми за програмиране са например [[Императивно програмиране|императивното програмиране]] и [[Функционално програмиране|функционалното програмиране]].
Програмите, написани на език за логическо програмиране, представляват поредица от правила и факти. Основни езици за логическо програмиране са [[Пролог (език за програмиране)|Prolog]], [
Правилата са написани във формата на клаузи:
Line 15 ⟶ 14:
Фактите могат да се третират като правила без тяло, т.е. безусловни правила. Те имат следната форма:
:<samp>H.</samp>
В най-простия случай, когато <samp>H, B<sub>1</sub>, ..., B<sub>n</sub></samp> са атомарни формули, тези клаузи се наричат [
<br>
В ASP и Datalog, програмите се характеризират само с [
:<samp>за да се реши H, трябва да се реши B<sub>1</sub> и ... и B<sub>n</sub>.</samp>
Например, нека имаме следната клауза:
:<samp>fallible(X) :- human(X).</samp>
базирана на пример, използван от [
:<samp>human(socrates).</samp>
може да се изпозва едновременно като процедура, която показва, че socrates е човек, и като процедура, която намира X, който е човек, чрез определянето на socrates за човек.
Декларативното четене при програмите, написани на логически език за програмиране, може да се използва за проверка на коректността на програмата. Също така, може да се използват техники за [
== История ==
Логическото програмиране е парадигма в програмирането, която е разработена през 70-те години, за решаването на задачи, свързани с изкуствения интелект. Вместо да се гледа на компютърната програма като описание стъпка по стъпка на един алгоритъм, програмата е замислена като логична теория, а на извикващата процедура се гледа като на теоремата, на която трябва да се установи истината. По този начин, изпълнението на програмата означава търсене на доказателство. В традиционните (императивни) езици за програмиране, програмата е процедурна спецификация как проблем трябва да бъде решен, а при езиците за логическо програмиране, програмата дава на компютъра описание на проблема, като използва редица факти и правила, а след това го кара да намери всички възможни решения.
Логическото програмиране има своите корени в [
Една от най-известните системи, основана на процедурно представяне и използване на знания, е езикът [[Planner]], разработен в [[Масачузетски технологичен институт|MIT]] от [[Карл Хюит]] (1969 г.)<ref>Carl Hewitt. '''Planner: A Language for Proving Theorems in Robots''' IJCAI 1969.</ref>. Той е предназначен за представяне и контрол на информация и дава възможност да се разглеждат не всички възможни, а само най-вероятните връзки. Друго популярно приложение е системата [[SHRDLU]] на [[Тери Виноград]] [[Станфордски университет|(Станфордския Университет]] SRI International).
Line 81 ⟶ 80:
Има две възможни решения, които решават първата подцел <samp>bird(X)</samp>, а именно <samp>X = john</samp> и <samp>X = mary</samp>. Втората подцел <samp>not abnormal(john)</samp> от първото възможно решение се проваля, тъй като <samp>wounded(john)</samp> успява и поради това <samp>abnormal(john)</samp> успява. Въпреки това втората подцел <samp>not abnormal(mary)</samp> на второто възможно решение успява, тъй като <samp>wounded(mary)</samp> се проваля, и затова <samp>abnormal(mary)</samp> се проваля. Ето защо, <samp>X = mary</samp> е единственото решение на първоначално поставената цел.
Micro-Planner е имал конструкция наречена „thnot“, която, когато се прилага към израз, връща стойността истина ако (и само ако) оценката на израза не успее. Подобен оператор обикновено е вграден и в съвременните [[Prolog]] реализации. Обикновено се изписва като <code>not( ''Goal'' )</code> или <code>\+ ''Goal''</code> , където<code>''Goal''</code> е някаква цел (твърдение), което да бъде доказано от програмата. Този оператор се различава от отрицанието в първия ред логика: отрицание като <code>\+ X == 1</code> се проваля, когато променливата <code>X</code> е свързана към атома <code>1</code> , но тя успява във всички останали случаи, включително когато <code>X</code> е неконсолидиран. Това прави разсъждението Prolog
Логическият статус на отрицанието като провал е неразрешено, докато Кийт Кларк [1978] показа, че при определени естествени условия, то е вярно (а понякога и пълно) изпълнение на класическото отрицание по отношение на целостта на програмата. Целостта се отнася приблизително до настройване на всички програмни клаузи с едни и същи предикати от лявата страна:
Line 98 ⟶ 97:
:<samp> not john = mary.</samp>
:<samp> not mary = john.</samp>
Представата за завършеност е тясно свързана с [
Като алтернатива на семантиката на завършване, отрицанието като провал може да се тълкува и познавателно, както в [
=== Представяне на знания ===
Line 107 ⟶ 106:
== Езици за логическо програмиране ==
=== Пролог ===
Програмният език [[Пролог (език за програмиране)|Пролог]] е създаден от [[Ален Колмерое]] през 1972 година. Той е резултат на съвместната работа между Колмерое и [[Робърт Ковалски]] в [[Единбург]]. Колмерое е работил върху [
През лятото и есента на 1972 година двамата отново работили заедно и разработили процесуално тълкуване на последиците. Чрез декларативно-процесуалната интерпретация, по-късно образували нотацията на програмният език Пролог,
:<samp>H :- B<sub>1</sub>,
която може да бъде четена и използвана, както декларативно така и процесуално.
Колмерое заедно с Филипе Роузел, използват двойното тълкуване, като основа на Пролог и така осъществяват неговото реализиране през късното лято на 1972 година. Първата Пролог програма написана през 1972 година и пусната в Марсилия, е била система за въпроси и отговори на френски език. Разработването на компилатора от Дейвид Уорън в Единбург през 1977 година дава голям тласък за развитието на Пролог като практически език за програмиране. Експериментите показали, че единбургският Пролог може да се конкурира по отношение скоростта на обработка с други символни езици за програмиране, като [
=== Абдуктивно логическо програмиране ===
[
:<samp>H :- B<sub>1</sub>, …, B<sub>n</sub>, A<sub>1</sub>, …, A<sub>n</sub>.</samp>
Line 136 ⟶ 135:
където предиката принципно е абдуктивен.
Решаването на проблеми се постига чрез извличане на хипотези, изразени по отношение на абдуктивните предикати. Тези проблеми могат да бъдат или наблюдения, които трябва да бъдат обяснени (както в [
<source lang="prolog">
:- canfly(X).
Line 173 ⟶ 172:
=== Конкурентно логическо програмиране ===
''Основна статия: [
Конкурентното логическо програмиране интегрира концепции от логическото програмиране в [
:<samp>H :- G<sub>1</sub>, …, G<sub>n</sub> | B<sub>1</sub>, …, B<sub>n</sub>.</samp>
Съединението <samp>G<sub>1</sub>, …, G<sub>n</sub></samp> се нарича [[гард]] на клаузата, а <samp>|</samp> е операторът. Декларативно, пазената Horn клауза се чете като обикновена логическа импликация:
|