Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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.?
-
prolog
-
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
-
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ů.
-
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 ;)
-
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)?
-
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.
-
Nakonec i Forth.
Co má Forth společného s logickým programováním?
-
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.
-
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.
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).
-
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.
-
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.
-
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é :) ).
-
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á.
-
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í.
-
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.
-
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Ě :-)
-
Můžete pak počítat MÁLO + MÁLO = MÁLO, MÁLO + MÁLO + MÁLO = HODNĚ :-)
No a?
-
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.
-
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.
-
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.
-
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 :)
-
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,...
-
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ší...
-
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).
-
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.