Логическо програмиране: Разлика между версии

Изтрито е съдържание Добавено е съдържание
м overlinking
Xqbot (беседа | приноси)
м Bot: Replace deprecated <source> tag and "enclose" parameter
Ред 67:
:<samp> H if A<sub>1</sub> and … and A<sub>n</sub> and not B<sub>1</sub> and … and not B<sub>n</sub>.</samp>
където <samp>H</samp> и всички <samp>A<sub>i</sub></samp> и <samp>B<sub>i</sub></samp> са атомни формули. Отрицанието в негативните литерали <samp>not B<sub>i</sub></samp> обикновено се отнася като " [[отрицание като провал]] ", защото в повечето приложения, в които се имплементира, отрицателното условие <samp>not B<sub>i</sub></samp> демонстрира, че положителното условие <samp>B<sub>i</sub></samp> не успява да се задържи. Например:
<sourcesyntaxhighlight lang="prolog">
canfly(X) :- bird(X), not abnormal(X).
abnormal(X) :- wounded(X).
Ред 73:
bird(mary).
wounded(john).
</syntaxhighlight>
</source>
Изобразяване на целта (твърдението) за намиране на нещо, което може да лети:
<sourcesyntaxhighlight lang="prolog">
:- canfly(X).
</syntaxhighlight>
</source>
Има две възможни решения, които решават първата подцел <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> е единственото решение на първоначално поставената цел.
 
Ред 126:
 
където <samp>Bi</samp> са произволни литерали (дефинирани или индуцирани и атомни или отрицателни). Например:
<sourcesyntaxhighlight lang="prolog">
canfly(X) :- bird(X), normal(X).
false :- normal(X), wounded(X).
Ред 132:
bird(mary).
wounded(john).
</syntaxhighlight>
</source>
където предиката принципно е абдуктивен.
 
Решаването на проблеми се постига чрез извличане на хипотези, изразени по отношение на абдуктивните предикати. Тези проблеми могат да бъдат или наблюдения, които трябва да бъдат обяснени (както в [[класическата абдукция]]) или задачи, които да бъдат решени (както е в обикновената логика на програмиране). Например хипотезата <samp>normal(mary)</samp> обяснява наблюдението <samp>canfly(mary)</samp>. Освен това, същата хипотеза предполага, че единственото решение <samp>X = mary</samp> намира нещо, което може да лети:
<sourcesyntaxhighlight lang="prolog">
:- canfly(X).
</syntaxhighlight>
</source>
Абдуктивното логическо програмиране е било използвано за диагностики, за откриване на грешки, планиране, обработка на език и машинно обучение. Също така е използвано, за да интерпретира как отрицанието като провал е част от абдукцията.
 
=== Металогично програмиране ===
Тъй като математическа логика има традиция за разграничаване на [[обектен език]] и метаезик, логическото програмиране също позволява [[Metalevel programming|програмиране на мета ниво]]. Най-простата металогическа програма е така наречената „vanilla“ мета-интерпретатор:
<sourcesyntaxhighlight lang="prolog">
solve(true).
solve((A,B)):- solve(A),solve(B).
solve(A):- clause(A,B),solve(B).
</syntaxhighlight>
</source>
където вярно представлява празена връзка. <samp>(A,B)</samp> означава, че има клауза за обектно-ниво на форма <samp>A:-B</samp>. Металогичното програмиране позволява на представители от обектното и от мета нивото да бъдат комбинирани, като на естествен език. Той може да бъде използван за осъществяване на всяка логика, която следва заключителните правила.
 
Ред 181:
 
Например, следната програма с конкурентна логика определя предикат <samp>shuffle(Left, Right, Merge)</samp>, който може да се използва, за да разбъркате два списъка <samp>Left</samp> и <samp>Right</samp>, комбинирайки ги в един списък <samp>Merge</samp>, който запазва подредбата на двата списъка <samp>Left</samp> and <samp>Right</samp>:
<sourcesyntaxhighlight lang="prolog">
shuffle([], [], []).
shuffle(Left, Right, Merge) :-
Ред 191:
Merge = [First | ShortMerge],
shuffle(Left, Rest, ShortMerge).
</syntaxhighlight>
</source>
Тук, <samp>[]</samp> представлява празен списък, а <samp>[Head | Tail]</samp> представлява списък с първия елемент <samp>Head</samp> последван от списък <samp>Tail</samp>. Програмата може да се използва, например, за да разбъркате списъците <samp>[ace, queen, king]</samp> и <samp>[1, 4, 2]</samp>, като се позовава на клаузата за цел:
<sourcesyntaxhighlight lang="prolog">
shuffle([ace, queen, king], [1, 4, 2], Merge).
</syntaxhighlight>
</source>
Програмата ще генерира недетерминистично единично решение – например <samp>Merge = [ace, queen, 1, king, 4, 2]</samp>.