Логическо програмиране: Разлика между версии
Изтрито е съдържание Добавено е съдържание
м замяна на чужда езикова препратка |
м Грешки в статичния код: Остарели HTML-тагове |
||
Ред 7:
Правилата са написани във формата на клаузи:
:<
Правилото има логически смисъл на импликация, която се чете <
:<
Правилата имат глава (следствие) <
Правилата дават информация за условията, които са достатъчни за изпълняването на дадена връзка или свойство. Главата на правилото се състои от единствен атом и означава свойството или връзката, която ще е в сила, ако са изпълнени всички предпоставки на правилото. Тялото на правилото се състои от поредица от атоми. Знакът, разделящ тялото и главата, се чете „е вярно, ако“.
Фактите могат да се третират като правила без тяло, т.е. безусловни правила. Те имат следната форма:
:<
В най-простия случай, когато <
<br>
В ASP и Datalog, програмите се характеризират само с [https://en.wikipedia.org/wiki/Declarative_programming декларативно] четене и тяхното изпълнение се извършва с помощта на процедури за „доказателство“, чието поведение не е под контрола на програмиста. За разлика от това, в Пролог-базираните езици, програмите се характеризират с т.н. процедурна интерпретация:
:<
Например, нека имаме следната клауза:
:<
базирана на пример, използван от [https://en.wikipedia.org/wiki/Terry_Winograd Terry Winograd]<ref>{{cite journal|author= T. Winograd (1972).|title= Understanding natural language |journal= Cognitive Psychology |volume=3| issue = 1 – 191|doi=10.1016/0010 – 0285(72)90002 – 3}}</ref>, за да илюстрира програмния език [https://en.wikipedia.org/wiki/Planner_(programming_language) Planner]. Като клауза в една логическа програма, може да се използва, както като процедура, която проверява дали X е склонен да греши, като се провери дали X е човек, така и като процедура за намирането на човек X, който е склонен на греши, чрез намирането на X, който да е човек. Дори фактите имат процедурна интерпретация. Например, клаузата:
:<
може да се изпозва едновременно като процедура, която показва, че socrates е човек, и като процедура, която намира X, който е човек, чрез определянето на socrates за човек.
Ред 64:
За повечето практически приложения, както и за приложения, които изискват не-еднообразни разсъждения в изкуствения интелект, логическите програми, които използват Хорнови клаузи, трябва да бъдат разширени до нормални логически програми с отрицателни условия. Една ''клауза'' в нормална логическа програма има формата:
:<
и се чете декларативно като логическа импликация:
:<
където <
<source lang="prolog">
canfly(X) :- bird(X), not abnormal(X).
Ред 79:
:- canfly(X).
</source>
Има две възможни решения, които решават първата подцел <
Micro-Planner е имал конструкция наречена „thnot“, която, когато се прилага към израз, връща стойността истина ако (и само ако) оценката на израза не успее. Подобен оператор обикновено е вграден и в съвременните [[:en:Prolog|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 е [https://en.wikipedia.org/wiki/Non-monotonic_logic не-еднозначно] : <code>X = 1, \+ X == 1</code> винаги се проваля, докато <code>\+ X == 1, X = 1</code> може да успее, свързвайки <code>X</code> към <code>1</code> , в зависимост от това дали <code>X</code> първоначално е обвързан (имайте предвид, че стандартния Prolog изпълнява твърдения от ляво на дясно).
Логическият статус на отрицанието като провал е неразрешено, докато Кийт Кларк [1978] показа, че при определени естествени условия, то е вярно (а понякога и пълно) изпълнение на класическото отрицание по отношение на целостта на програмата. Целостта се отнася приблизително до настройване на всички програмни клаузи с едни и същи предикати от лявата страна:
: <
: ...
: Н:
като определение на предиката
: <
където <
Например, завършването на програмата горе е:
:<
:<
:<
:<
:<
:<
Представата за завършеност е тясно свързана с [https://en.wikipedia.org/wiki/Circumscription_(logic) определението на МакКарти] за разсъждение по подразбиране и, че по презумпция едно твърдение е вярно, ако за него е известно, че е вярно – [https://en.wikipedia.org/wiki/Closed-world_assumption допускането на затворен свят].
Като алтернатива на семантиката на завършване, отрицанието като провал може да се тълкува и познавателно, както в [https://en.wikipedia.org/wiki/Stable_model_semantics семантиките на стабилен модел] на [https://en.wikipedia.org/wiki/Answer_set_programming програмирането с редица отговори]. В тази интерпретация <
=== Представяне на знания ===
Ред 111:
През лятото и есента на 1972 година двамата отново работили заедно и разработили процесуално тълкуване на последиците. Чрез декларативно-процесуалната интерпретация, по-късно образували нотацията на програмният език Пролог,
:<
която може да бъде четена и използвана, както декларативно така и процесуално.
Ред 120:
[https://en.wikipedia.org/wiki/Abductive_logic_programming Абдуктивното логическо програмиране] е разширение на обикновеното логическо програмиране, което позволява някои предикати, декларирани като абдуктивни, да бъдат „отворени“ или неопределени. Клаузата в абдуктивната логическа програма има следната формула:
:<
където <
:<
където <
<source lang="prolog">
canfly(X) :- bird(X), normal(X).
Ред 136:
където предиката принципно е абдуктивен.
Решаването на проблеми се постига чрез извличане на хипотези, изразени по отношение на абдуктивните предикати. Тези проблеми могат да бъдат или наблюдения, които трябва да бъдат обяснени (както в [https://en.wikipedia.org/wiki/Abductive_reasoning класическата абдукция]) или задачи, които да бъдат решени (както е в обикновената логика на програмиране). Например хипотезата <
<source lang="prolog">
:- canfly(X).
Ред 149:
solve(A):- clause(A,B),solve(B).
</source>
където вярно представлява празена връзка. <
=== Ограничително логическо програмиране ===
Ред 155:
[[:en:Constraint_logic_programming|Ограничително логическо програмиране]] съчетава Horn логика на програмиране с [[:en:Constraint_solving|решенията за ограничение]]. Тя разширява Horn клаузите, като позволява на някои предикати, декларирани като ограничаващи предикати, да се появят като литерали в тялото на клаузи. Програмата с ограничителна логика е набор от клаузи във формат:
:<
където <
:<
Въпреки това, като се има предвид, предикатите в главите на клаузи са определени от програмата с ограничителна логика, предикатите в ограниченията са предварително определени от някои домейн-специфицирана моделно-теоретична структура или теория. Процедурно подцелите, чиито предикати са определени от програмата, са решени чрез цел намаляване, както в обикновеното логическо програмиране, но ограниченията са проверени за удовлетворяване на специфично ограничение от домейна, с което се прилага семантиката на предикатите. Първоначалният проблем е решен като го сведе до задоволителна връзка между ограниченията.
Следната програмата с ограничителна логика представлява измислена времева база данни от историята на Джон като учител :
:<
:<
:<
:<
:<
Тук <
:<
Решението е: <
Ограничително логическо програмиране е използвано за решаване на проблеми в сфери като [[:en:Civil_engineering|гражданско строителство]], [[:en:Mechanical_engineering|машиностроене]], проверка [[:en:Digital_circuit|на цифрова схеми]], [[:en:Automated_timetabling|автоматизирано изготвяне на разписание]], [[:en:Air_traffic_control|контрол на въздушното движение]] и финанси. Тя е тясно свързана с [[:en:Abductive_logic_programming|абдуктивното логическо програмиране]].
Ред 176:
Конкурентното логическо програмиране интегрира концепции от логическото програмиране в [//en.wikipedia.org/wiki/Concurrent_programming конкурентно програмиране]. Неговото развитие е дало голям тласък през 1980 г. от избора на езика за програмиране на [[:en:Fifth_generation_computer|Japanese Fifth Generation Project (FGCS)]].<ref>{{cite journal|author= T. Winograd (1972).|title= Understanding natural language |journal= Cognitive Psychology |volume=3| issue = 1 – 191|doi=10.1016/0010 – 0285(72)90002 – 3}}</ref>.Програмата с конкурираща логика е набор от пазените [[:en:Horn_clauses|Horn clauses]] на формата :
:<
Съединението <
:<
Въпреки това, процедурно, когато има няколко клаузи, чиито начала <code>H</code> съвпадат с дадена цел, тогава всички клаузи се изпълняват паралелно, проверявайки дали тяхната охрана <
Например, следната програма с конкурентна логика определя предикат <
<source lang="prolog">
shuffle([], [], []).
Ред 193:
shuffle(Left, Rest, ShortMerge).
</source>
Тук, <
<source lang="prolog">
shuffle([ace, queen, king], [1, 4, 2], Merge).
</source>
Програмата ще генерира недетерминистично единично решение – например <
Може да се каже, че конкурентното логическо програмиране се основава на предаването на съобщения и следователно е предмет на същата неопределеност като други конкурентни системи за предаване на съобщения, също като [[:en:Actor_model|Actors]] (виж [[:en:Indeterminacy_in_concurrent_computation|Indeterminacy in concurrent computation]]). Carl Hewitt твърди, че конкуриращо логическо програмиране не се основава на логиката затова, че изчислителни стъпки не могат да бъдат логически изведени.
|