Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: nm 22. 07. 2015, 07:15:01

Název: Logické programovací jazyky?
Přispěvatel: nm 22. 07. 2015, 07:15:01
Existuje spousta jazyků, kde se programování točí kolem (především) číselných datových typů.

Existují jazyky, které jsou zaměřeny primárně na logiku než na čísla apod.?
Název: Re:Logické programovací jazyky?
Přispěvatel: gamer 22. 07. 2015, 07:24:32
prolog
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 07:47:35
Existují jazyky, které jsou zaměřeny primárně na logiku než na čísla apod.?
Ano. Akorát teda datové typy mají víceméně stejné, na těch až tak nesejde. Spíš je tam ta logika jako hlavní nástroj pro popis struktury algoritmu a dat. Pro programování obecných věcí se to moc neujalo, nejspíš proto, že to je takové... trochu specifické a ne úplně intuitivní, takže si s tím asi moc programátorů nechce lámat hlavu :)  V podstatě jde o to, že abys v logickém programovacím jazyku provedl nějaký výpočet o předem daných krocích, musíš mu předhodit nějaká fakta a odvozovací pravidla a svým způsobem odvozovací engine donutit, aby postupoval přesně tou cestou, kterou chceš, aby postupoval, takže je to trochu přes ruku...

Výborně se to ale hodí na problémy, kde primárně nechceš nějaký výpočet s nějakými konkrétními kroky, ale chceš se opravdu ptát, co plyne z nějakých faktů. Takže typicky nějaké znalostní databáze, na ty je to prima věc. Podle mě by k tomu aspoň trochu přičichnout měl každý programátor, čistě proto, aby věděl, že tahle se problémy dají řešit taky.

Asi nejznámější jazyk je Prolog a jeho jednodušší (a tímpádem i "předvídatelnější") varianta Datalog. Ale v podstatě je logickým programovacím jazykem i SQL (bez procedur). Jinak viz https://en.wikipedia.org/wiki/Logic_programming
Název: Re:Logické programovací jazyky?
Přispěvatel: gamer 22. 07. 2015, 08:11:41
trochu specifické a ne úplně intuitivní, takže si s tím asi moc programátorů nechce lámat hlavu :)

Ono se hlavně cokoliv implementované v prologu zvrhne na rekurzi se seznamem, což začně být velmi brzo hrozně otravné, protože člověk nedělá nic jiného, než že rozděluje seznamy a postupně je rekurzivně zpracovává. Ale jinak nic proto prologu, je to pěkný jazyk a myslím, že každý by si v něm měl zkusit něco udělat, získá trochu jiný náhled na problém, než z imperativních jazyků.
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 08:23:07
Ono se hlavně cokoliv implementované v prologu zvrhne na rekurzi se seznamem, což začně být velmi brzo hrozně otravné, protože člověk nedělá nic jiného, než že rozděluje seznamy a postupně je rekurzivně zpracovává.
To bych neviděl jako zásadní problém, to se stává i ve funkcionálním programování :) Horší je, že logické programování dává logiku :) hlavně tam, kde máš čistě deklarativní problém. Pokud začneš deklarativní programování znásilňovat k tomu, abys z něj vydupal de facto procedurální (což se v praxi u obecných problémů stane skoro vždycky), přestává ta jednoznačně deklarativní orientace jazyka dávat smysl a je to jenom vopruz...

Ale jinak nic proto prologu, je to pěkný jazyk a myslím, že každý by si v něm měl zkusit něco udělat, získá trochu jiný náhled na problém, než z imperativních jazyků.
Jj. Když už pro nic jinýho, tak je to dobrý pro to, že si člověk líp uvědomí, jak (predikátová) logika (hlavně prvního řádu) funguje. A může si vyzkoušet, že některé problémy se dají elegantně řešit převedením na zjišťování dokazatelnosti, protože to má člověk v inferenčním enginu tak nějak zadarmo ;)
Název: Re:Logické programovací jazyky?
Přispěvatel: Radek Miček 22. 07. 2015, 08:47:11
Existují jazyky, které jsou zaměřeny primárně na logiku než na čísla apod.?

Myslíte na matematickou logiku nebo na "business" logiku - tj. nějaký produkční systém (https://en.wikipedia.org/wiki/Production_system_%28computer_science%29)?
Název: Re:Logické programovací jazyky?
Přispěvatel: Aleš Hájek 22. 07. 2015, 09:16:23
Ano existují. Například Prolog, nebo Godel. Nakonec i Forth. V Prologu nemusíte používat čísla, můžete si zavést vlastní pojmy jako mnoho, trochu, více než mnoho atp.
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 09:30:19
Nakonec i Forth.
Co má Forth společného s logickým programováním?
Název: Re:Logické programovací jazyky?
Přispěvatel: Ivan 22. 07. 2015, 12:28:12
Prolog, SQL. Pokud te to zajima tak doporucuju tuhle vyzivnou diskuzi na SO http://stackoverflow.com/questions/2117651/difference-between-sql-and-prolog (http://stackoverflow.com/questions/2117651/difference-between-sql-and-prolog). Krome toho, ze jsou to jazyky logicke tam jsou navic jeste deklarativni. Tzn. programator rika co se ma stat, ale uz "nemuze" rict jak se to ma stat. Zpusob vykonani pozadavku urci az optimizer za behu.

Programovani v Prologu je hodne odlisny od ostatnich jazyku, nema to promenne, nema to podminky ani cykly. Dokonce to nema ani klicova slova. V Prologu se programuje podobne jako se stavi matematicka teorie. Definuji zakladni terminy, a na jejich zaklade se definuji abstratnejsi pojmy. Navic tu nefunguje klasicke rozdeleni na kod a data.

Tenhle pristup se hodi jen pro nektere ulohy. V Prologu se da programovat i imperativne, ale vysledek vypada hrozne.
Program v Prologu muze vypadat i tak, ze obsahuje pouze slova, ktera souvisi s terminologii dane ulohy a uplne tam chybi takova ta frameworkova omacka okolo.
Název: Re:Logické programovací jazyky?
Přispěvatel: Radek Miček 22. 07. 2015, 12:53:00
Tzn. programator rika co se ma stat, ale uz "nemuze" rict jak se to ma stat.

To je v každém vysokoúrovňovém jazyce. AFAIK deklarativnost je daná tím, jak se chovají proměnné v tom jazyce.

Citace
nema to promenne, nema to podminky ani cykly.

Proměnné to má. To bych spíš řekl, že C++ nemá proměnné. Prolog v podstatě má if-then-else (http://cs.union.edu/~striegnk/learn-prolog-now/html/node89.html) a některé Prology mají i cykly (https://sicstus.sics.se/sicstus/docs/4.3.0/html/sicstus/ref_002dsem_002dctr_002ddol.html).
Název: Re:Logické programovací jazyky?
Přispěvatel: Ivan Nový 22. 07. 2015, 13:08:04
Nakonec i Forth.
Co má Forth společného s logickým programováním?
No ve Forthu je číslo slovo, takže zase jednoduše můžete čísla nahradit slovy (tedy procedurami) a pracovat se zásobníkem, i operace je slovo, tak můžete definovat například  slova pro výraz MNOHO BEZ NĚKOLIKRÁT MÉNĚ = TROCHU, když aplikujete nějakou fuzzy logiku.
Název: Re:Logické programovací jazyky?
Přispěvatel: win 22. 07. 2015, 14:00:47
zalezi na tom co chces dosahnout.

problem s logickymi programovacimi jazyky je v tom, ze obsahuji konkretni predpoklady/modely ovlivnovani pevne zabudovane v operacich a kvantifikatorech a uz jen samotne cleneni na kvantifikatory, operace, predikaty. samotna existence predikatu predurcuje ukoncitelny model a ten sam dost zasadnim zpusobem omezuje.
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 14:29:29
No ve Forthu je číslo slovo, takže zase jednoduše můžete čísla nahradit slovy (tedy procedurami) a pracovat se zásobníkem, i operace je slovo, tak můžete definovat například  slova pro výraz MNOHO BEZ NĚKOLIKRÁT MÉNĚ = TROCHU, když aplikujete nějakou fuzzy logiku.
To ale pořád nemá nic společného s logickým programováním. Logické programování je založeno na tom, že mám množinu nějaký faktů a pravidel, a dotazuju se, co za takové situace lze dokázat. Forth je AFAIK čistokrevný imperativní jazyk, tak nemaťme zbytečně pojmy (už tak dost zmatené :) ).
Název: Re:Logické programovací jazyky?
Přispěvatel: Jann 22. 07. 2015, 14:42:57
Nakonec i Forth.
Co má Forth společného s logickým programováním?
No ve Forthu je číslo slovo, takže zase jednoduše můžete čísla nahradit slovy (tedy procedurami) a pracovat se zásobníkem, i operace je slovo, tak můžete definovat například  slova pro výraz MNOHO BEZ NĚKOLIKRÁT MÉNĚ = TROCHU, když aplikujete nějakou fuzzy logiku.

Není. Slovo je objekt ve slovníku, číslo je číslo. Jinou věcí je, že Forth nikomu nebrání definovat si třeba slovo 42, které se bude chovat jako číslo 666 a ještě přitom vypíše na obrazovku Dude (bude spárováno s načteným řetězcem prioritně, protože nejdřív se prohledává slovník a pak teprve se překladač pokouší řetězec interpretovat jako číslo).

Forth je ryze procedurální jazyk a jeho souvislost s logickým programováním mi taky není moc jasná.
Název: Re:Logické programovací jazyky?
Přispěvatel: Ivan Nový 22. 07. 2015, 15:10:04
Ad Mirek Prýmek a Jahn. No a proto tam bylo před Forth slovo nakonec (čti s přimhouřením očí). Tomu kdo pokládal otázku vadily i čísla a Fort a kterýkoliv jiný procedurální jazyk, nejen logické programování, lze využít tak, že žádná čísla nepoužijete. Ve Forthu díky jeho konstrukci je to to o kapánek přímočařejší, protože si můžete de facto předefinovat i "klíčová slova". Proto jsem ho uvedl, třeba autor dotazu spíše potřebuje toto, než sensu stricto logické programování.
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 15:29:45
Ve Forthu díky jeho konstrukci je to to o kapánek přímočařejší, protože si můžete de facto předefinovat i "klíčová slova". Proto jsem ho uvedl, třeba autor dotazu spíše potřebuje toto, než sensu stricto logické programování.
Ale tazateli přece nejde o to, jestli se nějaké symboly v jazyce dají předefinovat, nota bene tak uchylně, aby symbol "3" měl význam "5". Ptá se na to, jestli existují jazyky, které primárně nejsou určeny k manipulaci s čísly, ale s nějakými (symbolickými?) logickými fakty. A to jsou prostě logické programovací jazyky, mezi které Forth rozhodně nepatří ani náznakem.

Když už jsme u toho, možná by sem mohly spadat i jazyky, které jsou určené k nějakým jiným symbolickým operacím, třeba k nějakým úpravám matematických výrazů nebo tak něco. Určitě něco existuje, ale tady už nemůžu sloužit, nikdy jsem nic takovýho nepoužíval.
Název: Re:Logické programovací jazyky?
Přispěvatel: Ivan Nový 22. 07. 2015, 15:54:55
Proč předefinovávat 3 na 5, to jsem nepsal, ale 3 na MÁLO už smysl má. Můžete pak počítat  MÁLO + MÁLO = MÁLO, MÁLO + MÁLO + MÁLO = HODNĚ :-)
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 22. 07. 2015, 16:19:54
Můžete pak počítat  MÁLO + MÁLO = MÁLO, MÁLO + MÁLO + MÁLO = HODNĚ :-)
No a?
Název: Re:Logické programovací jazyky?
Přispěvatel: abbore 22. 07. 2015, 16:26:47
Citace
nema to promenne, nema to podminky ani cykly.

Proměnné to má. To bych spíš řekl, že C++ nemá proměnné. Prolog v podstatě má if-then-else (http://cs.union.edu/~striegnk/learn-prolog-now/html/node89.html) a některé Prology mají i cykly (https://sicstus.sics.se/sicstus/docs/4.3.0/html/sicstus/ref_002dsem_002dctr_002ddol.html).
Nie je dolezite popisovat, ci to premenne ma alebo nema, lebo pod tym si autor otazky asi nic nepredstavi. Lepsie je povedat, ako tam tie premenne vyzeraju.
C++ a imperativne programovacie jazyky maju premenne ako miesto v pamati. Je mozne ich precitat a aj zapisat.
Prolog ma premenne ako zviazanie logickych hodnot. Vo vseobecnosti sa neda povedat, co je presne v premennej a nie je tam mozne nieco zapisat. Je mozne sa podla toho rozhodovat a tak obmedzovat mnozinu moznosti, ktore moze premenna nadobudat. To dava s unifikaciou pouzitelne programovanie.

if-then-else a aj cykly sa daju v prologu vdaka predchadzajucemu trivialne spravit, ale je to asi nadbytocne, ked mame unifikaciu.
Název: Re:Logické programovací jazyky?
Přispěvatel: zboj 22. 07. 2015, 16:27:46
Existuje spousta jazyků, kde se programování točí kolem (především) číselných datových typů.

Existují jazyky, které jsou zaměřeny primárně na logiku než na čísla apod.?

Již zmíněný Prolog. Dále lze mnoho problémů převést na SAT (plánování, parsing...), což je výroková logika. Syntaxí se Prologu podobá ASP (funkčně je to ale spíše SAT). Celkem dobře to je popsané na anglické Wikipedii.
Název: Re:Logické programovací jazyky?
Přispěvatel: BoneFlute 23. 07. 2015, 00:13:56
Existují jazyky, které jsou zaměřeny primárně na logiku než na čísla apod.?
Ano. Akorát teda datové typy mají víceméně stejné, na těch až tak nesejde. Spíš je tam ta logika jako hlavní nástroj pro popis struktury algoritmu a dat. Pro programování obecných věcí se to moc neujalo, nejspíš proto, že to je takové... trochu specifické a ne úplně intuitivní, takže si s tím asi moc programátorů nechce lámat hlavu :)  V podstatě jde o to, že abys v logickém programovacím jazyku provedl nějaký výpočet o předem daných krocích, musíš mu předhodit nějaká fakta a odvozovací pravidla a svým způsobem odvozovací engine donutit, aby postupoval přesně tou cestou, kterou chceš, aby postupoval, takže je to trochu přes ruku...
A není lepší v takových případech udělat úkrok stranou, a takový imperativní výpočet vytknout do nějaké rutiny... V SQL na to jsou uložené procedury, a přijde mi ta provázanost logického a imperativního celkem fajn.
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 23. 07. 2015, 00:16:27
A není lepší v takových případech udělat úkrok stranou, a takový imperativní výpočet vytknout do nějaké rutiny... V SQL na to jsou uložené procedury, a přijde mi ta provázanost logického a imperativního celkem fajn.
Taky si myslím, nedávno jsem přesně tohle použil: Elixir na výkonnou část, Prolog na dotazování nad daty. Akorát to někdy asi může být trochu problém technickej - interoperabilita různých jazyků nebývá procházka růžovou zahradou :)
Název: Re:Logické programovací jazyky?
Přispěvatel: BoneFlute 23. 07. 2015, 00:23:01
Taky si myslím, nedávno jsem přesně tohle použil: Elixir na výkonnou část, Prolog na dotazování nad daty. Akorát to někdy asi může být trochu problém technickej - interoperabilita různých jazyků nebývá procházka růžovou zahradou :)
Jsem někde viděl implementaci Prologu (nebo jeho části) v CL. Jak jsi to měl řešené v Elixíru?
V PostgreSQL je to naopak. Základní engine je jakože logické, a ty rutiny můžeš psát v široké paletě jazyků. Java, Python, Lua,...
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 23. 07. 2015, 08:21:20
Jsem někde viděl implementaci Prologu (nebo jeho části) v CL. Jak jsi to měl řešené v Elixíru?
Implementací Prologu v Erlangu: https://github.com/rvirding/erlog a můj trapný wrapper pro něj: https://github.com/mprymek/exlog

Ten můj pokus, který ho využívá, je tady: https://github.com/mprymek/symconfig ale je tam zatím nahraná jenom starší verze, která toho moc neumí :)

V PostgreSQL je to naopak. Základní engine je jakože logické, a ty rutiny můžeš psát v široké paletě jazyků. Java, Python, Lua,...
Jj, vím. Ale ty SQL dotazy tam ještě taky sypeš nějakým "normálním" jazykem - Javou, PHP, ... Určitě je to praktický mít imperativní jazyk "zvenku", protože si v něm bez problémů uděláš IO apod. a to vlastní logický chroustání necháš na ten logický jazyk. Do Prologu se sice dají celkem pohodlně dávat callbacky třeba na céčko (v Prologu nepotřebuješ referenční trasparentnost apod.), ale opačně je to imho pohodlnější...
Název: Re:Logické programovací jazyky?
Přispěvatel: Radek Miček 23. 07. 2015, 09:18:41
Ale ty SQL dotazy tam ještě taky sypeš nějakým "normálním" jazykem - Javou, PHP, ...

V SecuritEase si napsali CQL (https://dtai.cs.kuleuven.be/CHR/files/Elston_SecuritEase.pdf#27).
Název: Re:Logické programovací jazyky?
Přispěvatel: Mirek Prýmek 23. 07. 2015, 09:25:59
V SecuritEase si napsali CQL (https://dtai.cs.kuleuven.be/CHR/files/Elston_SecuritEase.pdf#27).
Jo, generovat SQL z Prologu si umím představit v pohodě. Ještě lepší by to bylo z Datalogu. Mně šlo spíš o to, že Prolog je podobně deklarativní jako SQL, takže není od věci ho obalit něčím víc imperativním (popř. funkcionálním) stejně jako se to dělá s SQL.