Logické programování

PrologEdit

Hlavní článek: Prolog

programovací jazyk Prolog byl vyvinut v roce 1972 Alain Colmerauer. Vyplynulo to ze spolupráce mezi Colmerauerem v Marseille a Robertem Kowalskim v Edinburghu. Colmerauer pracoval na porozumění přirozenému jazyku, pomocí logiky reprezentovat sémantiku a pomocí rozlišení pro zodpovězení otázek. V létě roku 1971, Colmerauer a Kowalski zjistil, že clausal formě logiky, by mohla být použita k reprezentaci formální gramatiky a že usnesení theorem provers by mohly být použity pro analýzu. Pozorovali, že některé věty provers, jako hyper-rozlišení, se chovají jako zdola nahoru analyzátory a jiní, jako SL-rozlišení (1971), se chovají jako shora dolů analyzátory.

bylo to v následujícím létě 1972, že Kowalski, opět ve spolupráci s Colmerauerem, vyvinul procedurální interpretaci důsledků. Tato dvojí deklarativní / procedurální interpretace se později formalizovala v notaci prolog

H :- B1,…, Bn.

které lze číst (a používat) deklarativně i procedurálně. Rovněž vyšlo najevo, že taková ustanovení by mohla být omezena na určité klauzule nebo klauzule Horn, kde H, B1,…, Bn jsou všechny atomové predikátové logické vzorce a toto SL-rozlišení by mohlo být omezeno (a zobecněno) na svěží nebo SLD-rozlišení. Kowalského procedurální výklad a LUSH byly popsány v memorandu z roku 1973, publikovaném v roce 1974.

Colmerauer, s Philippe Roussel, používá tento dvojí výklad ustanovení jako základ Prolog, který byl realizován v létě a na podzim roku 1972. První program Prolog, napsaný také v roce 1972 a implementovaný v Marseille, byl francouzský systém odpovědí na otázky. Použití prologu jako praktického programovacího jazyka bylo dáno velkou dynamikou vývojem kompilátoru Davidem Warrenem v Edinburghu v roce 1977. Experimenty prokázaly, že Edinburgh Prolog může konkurovat rychlosti zpracování jiných symbolických programovacích jazyků, jako je Lisp. Edinburgh Prolog se stal de facto standardem a silně ovlivnil definici standardu ISO prolog.

Abductive logika programmingEdit

Abductive logické programování je rozšíření normální Logické Programování, které umožňuje, aby některé predikáty, je deklarován jako abducible predikáty, aby se „otevřít“ nebo undefined. Klauzule v abdukčním logickém programu má tvar:

H: – B1,…, Bn, A1,…, An.

kde H je atomový vzorec, který není unášitelný, všechny Bi jsou literály, jejichž predikáty nejsou unášitelné, a Ai jsou atomové vzorce, jejichž predikáty jsou unášitelné. Abducibilní predikáty mohou být omezeny omezeními integrity, která mohou mít tvar:

false : – L1,…, Ln.

kde Li jsou libovolné literály (definované nebo abducibilní a atomové nebo negované). Například:

canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).

kde je predikát normální abducible.

řešení problémů je dosaženo odvozením hypotéz vyjádřených z hlediska abducibilních predikátů jako řešení problémů, které mají být vyřešeny. Tyto problémy mohou být buď pozorování, která je třeba vysvětlit (jako v klasickém abdukčním uvažování), nebo cíle, které je třeba vyřešit(jako v normálním logickém programování). Například hypotéza normální (mary) vysvětluje pozorování canfly (mary). Kromě toho, stejné hypotézu, znamená to jediné řešení X = mary cílem najít něco, který může létat:

:- canfly(X).

Abductive logické programování byl použit pro diagnostiku, plánování, zpracování přirozeného jazyka a strojového učení. Používá se také k interpretaci negace jako selhání jako formy únosného uvažování.

Metalogic programmingEdit

Protože matematická logika má dlouhou tradici rozlišování mezi objekt jazyka a meta, logické programování také umožňuje metalevel programování. Nejjednodušší metalogic program je tak-zvané „vanilkový“ meta-interpret:

 solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).

kde je pravda zastupuje prázdný spojení, a bod(A,B) znamená, že je objekt úrovni klauzule formA :- B.

Metalogic programování umožňuje na úrovni objektu a metalevel prohlášení, jež mají být v kombinaci, jako v přirozeném jazyce. Může být také použit k implementaci jakékoli logiky, která je specifikována jako inferenční pravidla. Metalogic je používán v logické programování realizovat metaprograms, které manipulovat jiné programy, databáze, znalostní základny nebo axiomatická teorie jako data.

Omezení logiky programmingEdit

Hlavní článek: Constraint logic programming

Omezení logické programování kombinuje Roh doložka logické programování s omezujícími řešení. Rozšiřuje klauzule rohů tím, že umožňuje, aby se některé predikáty, deklarované jako predikáty omezení, vyskytovaly jako literály v těle klauzulí. Logický program omezení je sada klauzulí ve tvaru:

H: – C1,…, Cn ◊ B1, …, Bn.

kde H a všechny Bi jsou atomové vzorce a Ci jsou omezení. Deklarativně se takové klauzule považují za běžné logické důsledky:

H pokud C1 a … a Cn A B1 A … a Bn.

nicméně, zatímco predikáty v hlavách klauzulí jsou definovány programem constraint logic, predikáty v omezeních jsou předdefinovány nějakou doménově specifickou modelovou teoretickou strukturou nebo teorií.

Procedurálně, dílčích cílů, jejichž predikáty jsou definovány v programu jsou řešeny cíl-snížení, jako v běžné logické programování, ale omezení jsou kontrolovány pro splnitelnost domény-specifické omezení-řešitel, který implementuje sémantiku omezení predikáty. Počáteční problém je vyřešen redukcí na uspokojivou spojku omezení.

následující program constraint logic představuje hračkářskou temporální databázi Johnovy historie jako učitele:

teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.teaches(john, software, T) :- 1999 ≤ T, T < 2005.teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.rank(john, instructor, T) :- 1990 ≤ T, T < 2010.rank(john, professor, T) :- 2010 ≤ T, T < 2014.

zde ≤ a < Jsou predikáty omezení s obvyklou zamýšlenou sémantikou. Následující Cílová klauzule dotazuje databázi, aby zjistila, kdy john vyučoval logiku a byl profesorem:

: – učí(john, logika, T), hodnost(john, profesor, T).

roztok je 2010 ≤ T, T ≤ 2012.

Omezení logické programování byl použit k řešení problémů v takových oblastech, jako je stavebnictví, strojírenství, digitální, obvod, ověřování, automatizované sestavování jízdních řádů, řízení letového provozu, a finance. Úzce souvisí s abdukčním logickým programováním.

Souběžných logika programmingEdit

Hlavní článek: Souběžné logické programování

Souběžných logické programování integruje pojmy logické programování s souběžné programování. Jeho vývoj byl dán velkým impulsem v 80. letech výběrem programovacího jazyka systémů japonského projektu páté generace (FGCS).

souběžný logický program je množina chráněných klauzulí ve tvaru:

H: – G1,…, Gn / B1,…, Bn.

konjunkce G1, … , Gn se nazývá strážcem klauzule a | je provozovatelem závazku. Deklarativně se klauzule o rohu považují za běžné logické důsledky:

H pokud G1 a … a Gn A B1 A … a Bn.

nicméně, procedurálně, pokud existuje několik klauzulí, jejichž hlavy h odpovídají danému cíli, pak jsou všechny klauzule prováděny paralelně, kontrola, zda jejich stráže G1,… , GN hold. Pokud stráže více než jedné klauzule drží, pak se zavázala volba jedné z klauzulí, a provádění pokračuje s podskupinami B1,…, Bn zvolené klauzule. Tyto subgoály lze také provádět paralelně. Souběžné logické programování tedy implementuje formu „nezajímá nedeterminismus“, spíše než „nevím nedeterminismus“.

například, následující souběžné logika programu definuje predikát shuffle(Vlevo, Vpravo, Korespondence) , které mohou být použity k shuffle dvou seznamů Vlevo a Vpravo, a sloučit je do jediného seznamu Sloučení, který zachovává objednání dvou seznamů Vlevo a Vpravo:

shuffle(, , ).shuffle(Left, Right, Merge) :- Left = | Merge = , shuffle(Rest, Right, ShortMerge).shuffle(Left, Right, Merge) :- Right = | Merge = , shuffle(Left, Rest, ShortMerge).

zde představuje prázdný seznam a představuje seznam s hlavou prvního prvku následovanou ocasem seznamu, jako v prologu. (Všimněte si, že první výskyt | ve druhé a třetí klauzule je konstruktor seznamu, zatímco druhý výskyt | je závazek provozovatele.) Program může být použit, například, zamíchat seznamy a vyvoláním cílem ustanovení:

shuffle(, , Merge).

program bude non-deterministicky generovat jediné řešení, například Sloučit = .

Pravděpodobně, souběžné logické programování je založeno na předávání zpráv, tak to se vztahuje stejná neurčitost, jako jiné souběžné message-passing systémů, jako jsou Herci (viz Neurčitosti při současném výpočtu). Carl Hewitt tvrdil, že souběžné logické programování není založeno na logice v jeho smyslu, že výpočetní kroky nelze logicky odvodit. Nicméně, v současné logické programování, žádné důsledku ukončení výpočtu je logickým důsledkem programu, a jakýkoliv dílčí výsledek částečného výpočtu je logickým důsledkem programu a zbytkového cíl (procesní síť). Neurčitost výpočtů tedy znamená, že nelze odvodit všechny logické důsledky programu.

souběžné omezení logiky programováníeditovat

Hlavní článek: Souběžné omezení, logické programování

Souběžné omezení, logické programování kombinuje souběžných logické programování a omezení logického programování, pomocí omezení kontroly souběžnosti. Klauzule může obsahovat stráž, což je sada omezení, která mohou blokovat použitelnost klauzule. Když jsou splněny stráže několika klauzulí, souběžné logické programování s omezením se zavazuje použít pouze jednu.

induktivní logické programováníeditovat

Hlavní článek: Induktivní logické programování

Induktivní logické programování se zabývá zevšeobecňovat pozitivní a negativní příklady v kontextu znalosti: strojové učení logické programy. Nedávná práce v této oblasti, kombinující logické programování, učení a pravděpodobnost, dala vzniknout nové oblasti statistického relačního učení a pravděpodobnostního indukčního logického programování.

Vyššího řádu logické programmingEdit

Několik vědci rozšířené logické programování s vyšší programovací funkce odvozené z vyššího řádu logiky, jako predikátové proměnné. Mezi tyto jazyky patří rozšíření Prolog HiLog a λProlog.

Lineární logiky programmingEdit

Založit logické programování v lineární logika vyústila v návrh logických programovacích jazyků, které jsou podstatně výraznější, než těch, které jsou založeny na klasické logiky. Programy klauzule Horn mohou představovat pouze změnu stavu změnou argumentů na predikáty. V lineárním logickém programování lze použít okolní lineární logiku k podpoře změny stavu. Některé rané návrhy logických programovacích jazyků založených na lineární logice zahrnují LO, Lolli, ACL a Forum . Fórum poskytuje cílenou interpretaci celé lineární logiky.

objektově orientované logické programováníedit

F-logic rozšiřuje logické programování o objekty a syntaxi rámce.

Logtalk rozšiřuje programovací jazyk Prolog s podporou objektů, protokolů a dalších konceptů OOP. Podporuje většinu standardně kompatibilních systémů Prolog jako backend kompilátory.

transakční logika programováníedit

transakční logika je rozšíření logického programování s logickou teorií aktualizací modifikujících stav. Má jak modelovou teoretickou sémantiku, tak procedurální. Implementace podmnožiny transakční logiky je k dispozici v systému Flora-2. K dispozici jsou také další prototypy.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.