{"id":81,"date":"2007-06-22T18:21:44","date_gmt":"2007-06-22T17:21:44","guid":{"rendered":"http:\/\/blog.esperantilo.org\/?p=81"},"modified":"2007-07-20T09:32:42","modified_gmt":"2007-07-20T08:32:42","slug":"ludoj-kun-programlingvo-prologo","status":"publish","type":"post","link":"http:\/\/blog.esperantilo.org\/?p=81","title":{"rendered":"Ludoj kun programlingvo &#8222;prolog&#8220;"},"content":{"rendered":"<p><a href=\"http:\/\/eo.wikipedia.org\/wiki\/Prolog\"><cite>Prolog<\/cite><\/a> estas programa lingvo, kiu bazas sur predikatkalkulo. Onidire tiu lingvo havas mirindajn eblojn kaj estas uzata por artefarita intelekto kaj anka\u016d en lingvistika programado. Tio estas por mi la ka\u016dzo pli detale rigardi la lingvon. Mian intereson pri tia programado vekis fine la <a href=\"http:\/\/mitpress.mit.edu\/sicp\/full-text\/book\/book-Z-H-29.html#%_sec_4.4\">\u0109apitro pri logika programado<\/a> en libro <cite>&#8222;Structure and Interpretation of Computer Programs&#8220;<\/cite> de Harold Abelson, Gerlald Jay Sussman kun Julie Sussman. La prezentita algoritmo nomi\u011das angle <a href=\"http:\/\/en.wikipedia.org\/wiki\/Unification\"><cite>&#8222;unification&#8220;<\/cite><\/a>. Mi iam anka\u016d en mia \u015dtudperiodo provis prologon, sed tiam mi ne sukcesic kompreni pli ol la konata ekzemplo kun familio.<\/p>\n<p>Feli\u0109e en nuna tempo oni per interreto tre facile povas trovi liberan programaron kaj dokumentaron. Do mi instalis <a href=\"http:\/\/www.swi-prolog.org\/\">SWI-Prolog<\/a> kaj komencis legi la instruan interetan libron pri prologo<br \/>\n(<a href=\"http:\/\/www.coli.uni-saarland.de\/~kris\/learn-prolog-now\/\"><cite>Lern Prolog Now!<\/cite><\/a>).<\/p>\n<p>La ideo de prologo estas tre alloga. Oni ne difinas kiel fari ion, sed nur logikaj reguloj. La prologo mem trovas la rezulton de demando. Do programo estas la bazo de reguloj. Tio estas pro specifaj tipoj de problemoj tre potenca ilo. La prologo estas anka\u016d tre avanta\u011da por prilaboro de arbaj strukturoj kaj listoj. Kvankam en prologo oni \u015dajne ne devas pensi pri la afero, kiel la programo solvas problemojn, post pli detala rigardo la interna kalkulo de prologo estas esenca afero. Do estas tre grave kiel oni difinas regulojn kaj anka\u016d la ordo de reguloj. Ne estas anka\u016d tre facile kompreni la rekursion en tiuj reguloj. Sen mia okupo pri lingvo <a href=\"http:\/\/blog.esperantilo.org\/?p=76\">Scheme<\/a> mi preska\u016d ne havus \u015dancojn kompreni la principon de akumulatoro \u0109e rekursio. Mi pensas, ke sen scio pri funkciaj lingvoj kiel &#8222;Lispo, Scheme&#8220; oni tre malfacile povus kompreni prologon. Insterese, ke mi retrovis \u0109e tiu kazo la saman <a href=\"http:\/\/www.htdp.org\/2003-09-26\/Book\/curriculum-Z-H-39.html#node_sec_31.1\">ekzercon<\/a> kiel \u0109e \u015demo, kiu pritraktas la reversadon de listo kun kaj sen akumulatoro<\/p>\n<pre>\r\n;; naiva programado\r\nnaiverev([],[]).\r\nnaiverev([H|T],R) :- naiverev(T,RevT),append(RevT,[H],R).\r\n;; kun akumulatoro\r\naccRev([H|T],A,R) :- accRev(T,[H|A],R).\r\naccRev([],A,A).\r\nrev(L,R) :- accRev(L,[],R).\r\n\r\n;; la sama tasko en \u015demo.\r\n;; invert : (listof X)  ->  (listof X)\r\n;; to construct the reverse of alox\r\n(define (invert alox0)\r\n  (local (;; accumulator is the reversed list of all those items\r\n\t  ;; on alox0 that precede alox\r\n\t  (define (rev alox accumulator)\t\r\n\t    (cond\r\n\t      [(empty? alox) accumulator]\r\n\t      [else\r\n\t\t(rev (rest alox) (cons (first alox) accumulator))])))\r\n    (rev alox0 empty)))\r\n<\/pre>\n<p>La programo en prologo estas mirinde mallonga e\u0109 \u0109e komparo kun \u015demo. Por mi nova estas en prologo la fakto, ke mi a\u016d tuj sukcesas difini korektan regulon a\u016d mi longe pensas pri 2 linioj de programo. Ekzemple mi tre longe pensis pri <a href=\"http:\/\/www.coli.uni-saarland.de\/~kris\/learn-prolog-now\/html\/node52.html#sec.l6.exercises\">ekzerco 6.3<\/a>.<br \/>\nLa tasko estis: Difinu la regulon swapfl\/2 kiu pruvas \u0109e du listoj estas samaj, krome ke la unua kaj ka lasta elemento estis inter\u015dan\u011ditaj.<\/p>\n<pre>\r\nswapf([1,2,3,4],[4,2,3,1])\r\n Yes\r\nswapf([1,2,3,4],[1,2,3,4])\r\n No\r\n<\/pre>\n<p>La ekzerco sugestis uzi la predikaton append\/3. Kaj anta\u016daj ekzercoj prilaboris la predikaton final(X,List), kiu testas, \u0109u X estas la fino de listo L. Do mia unua provo estis.<\/p>\n<pre>\r\nfinal([F],F)\r\nfinal(F,[H|T]) :- final(F,T).\r\nswapf([H1|T1],[H2|T2]) :-\r\n  final(H2,T1),\r\n  final(H1,T2),\r\n  append(R,[H1],T2),\r\n  append(R,[H2],T1).\r\n<\/pre>\n<p>La programo funkciis perfekte por jes\/ne demandoj, sed kiam mi volis demandi kun variablo, la programo donis la unuan rezulton kaj poste dronis en senfina laborado.<\/p>\n<pre>\r\n35 ?- swapfln([1,2,3,4],[4,2,3,1]).\r\n\r\nYes\r\n36 ?- swapfln([1,2,3,4],X).\r\n\r\nX = [4, 2, 3, 1] ;\r\n\r\nAction (h for help) ? abort\r\n% Execution Aborted\r\n<\/pre>\n<p>Mi longe penis, kiel plibonigi tion. Fine mi difinis la regulojn kun rekursio kaj akumulatro.<\/p>\n<pre>\r\nswapflInner([End],[Begin],Begin,End).\r\nswapflInner([E|T1],[E|T2],Begin,End) :- swapflInner(T1,T2,Begin,End).\r\nswapfl([H1|T1],[H2|T2]) :- swapflInner(T1,T2,H1,H2).\r\n<\/pre>\n<p>Tiu difino sukcesis anka\u016d solvi la demandojn swapfln([1,2,3,4],X) kaj swapfln(X,[1,2,3,4]). Do prologo ne estas vere facila maniero de programado pro komencantoj kaj povas enhavi multajn a\u0109ajn embuskojn. Mi povas ima\u011di, ke de iu grando la flegado de tiuj programoj estas tre malfacila kaj bezonas longan sperton. Por mi ankora\u016d stranga estas la funkciado de predikato rek\/2.<\/p>\n<pre>\r\n;; en tiu direkto funkcias \u0109io\r\n2 ?- rev([1,2,3],X).\r\n\r\nX = [3, 2, 1] ;\r\n\r\nNo\r\n;; en alia direkto okazas eraro\r\n3 ?- rev(X,[1,2,3]).\r\nERROR: Out of local stack\r\n   Exception: (209,511) accRev(_G1257054, [_G1257053, _G1257047|...], [1, 2, 3]) ? \r\n<\/pre>\n<p>Do \u015dajne en prologo oni devas zorge pripensi, kien oni povas enmeti variablojn. En la instrua libro oni tamen neniam pri tio diris kaj \u015dajne komentarojn kaj priskriboj de predikatoj ne estas kutimaj.<\/p>\n<p>\nNun mi da\u016dre lernos tiun lingvon kaj mi volas apena\u016d vidi kelkajn ekzemplojn pri lingvistika programado per prologo. Interesa estas anka\u016d por mi vidi la programojn, kiuj estas ta\u016dgaj por reala mondo. Do programoj, kiu havas uzulan interfacon a\u016d prilaboras dosierojn. Feli\u0109e la labormanieron de prologo oni povas uzi de anka\u016d en aliaj lingvoj. Ofte medioj por prologo ebligas la komunikadon kun programoj skribitaj en C kaj Java. Ekzistas anka\u016d moduloj por javo, kiu ebligas la uzadon de logika programado. Ofte tiuj moduloj estas uzataj por difini kaj traser\u0109i bazojn de datumoj.\n<\/p>\n<h3>leciono por Esperantilo<\/h3>\n<p>Certe de programlingvo <cite>prolog<\/cite> oni povas lerni multon anka\u016d por aliaj programaj lingvoj. La \u0109efa algoritmo de prologo, kiu estas <cite>&#8222;unification&#8220;<\/cite> oni povas anka\u016d programi en aliaj lingvoj. Anka\u016d ekzistas <a href=\"http:\/\/wiki.tcl.tk\/15159\">ekzempla programado por Tcl<\/a>. Mi pensas, ke per metodoj de prologo, oni povus tre pure difini la regulojn por ser\u0109ado kaj transformigo de sintaksaj arboj. Penseblaj estas reguloj por gramatika korektilo, kiuj estas difinitaj la\u016d logika maniero.<\/p>\n<p>Nun reguloj aspektas kiel sube:<\/p>\n<pre>\r\nmatch {\r\n      folioj {\r\n         OR {b kilogramo b kvanto b litro b amaso b metro}\r\n         v de\r\n      }\r\n}\r\n<\/pre>\n<p>Tiu lingvo estas tre simila al prefiksa predikata matematiko (+ 2 2) kiu estas uzata en \u015demo. Tio nun sufi\u0109as por facilaj reguloj.<br \/>\nEsprimo (v de) signifas = (folio de sintaksa arbo, kies vorto estas &#8222;de&#8220;). Se oni povus uzi variablojn kaj logikaj reguloj, tiuj difinoj povus estas pli kompleksaj. Ekzistas nun projektoj, kiuj uzas prologon por difini regulojn de XML-transformado. Onidire tiuj reguloj estas pli klaraj ol tiuj de XSLT. La alia eblo estas la difino de sintaksa analizilo per Prologo. La fama <a href=\"http:\/\/eo.wikipedia.org\/wiki\/Distribuita_Lingvo-Tradukado\">DLT<\/a> projekto uzis prologon por tiu tasko. Mi havas dubojn pri tio, \u0109u vere prologo estas tre ta\u016dga por tiu celo. Unue oni plej ofte interesas ne pri \u0109iuj eblaj analizoj sed nur pri unu analizo, kiu estas la plej ver\u015dajna. Due oni volas havi la rezultojn de analizo, e\u0109 se la plena korekta analizo ne estas ebla. Tial la labormaniero de prologo, kiu estas &#8222;top-down&#8220; ne estas avanta\u011da. Mi pensas anka\u016d, ke difino de esceptoj de natura lingvo (anka\u016d de Esperanto) povas esti tre malfacila en prologo. Mi \u011dis nun ne trovis la pritakson de tiu problemo kaj estas tre never\u015dajne, ke tio ekzistus por Esperanto. \u015cajne \u0109iuj nunaj sintaksaj analiziloj ne plu uzas prologon a\u016d logikan programadon. Eble la \u0109efa kazo estas la rapideco de tiuj programoj. La alia kampo estas la difino de semantikaj retoj. Tio \u015dajne estas la forta trajto de prologo. En prologo estas eble difini demandoj sur rekursiaj strukturoj kaj evidente semantikaj retoj estas rekursiaj. Tio ne estas eble en normala SQL de kutimaj <a href=\"http:\/\/eo.wikipedia.org\/wiki\/Datumbazo\">datumbazoj<\/a>. Semantikaj retoj estas kondi\u0109o por pli bona ma\u015dina tradukado.<\/p>\n<p>\nNe estas facila tasko tralabrori la abundan teorion kaj enprogrami tion en la ta\u016dga programo, kiu donas al la uzantoj iun profiton. Ofte estas por uzantoj tre utilaj tute simplaj funkcioj. Aliaj funkcioj bezonas fundan teorion kaj longan rezonadon.<br \/>\nAvanta\u011de estas, ke pro interreto nun e\u0109 la neprofesiulo kiel mi havas la senpagan aliron al modernaj programoj kaj dokumentaro.<br \/>\nAnka\u016d hodia\u016daj hejmaj komputiloj estas sufi\u0109e rapidaj por tiaj taskoj.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prolog estas programa lingvo, kiu bazas sur predikatkalkulo. Onidire tiu lingvo havas mirindajn eblojn kaj estas uzata por artefarita intelekto kaj anka\u016d en lingvistika programado. Tio estas por mi la ka\u016dzo pli detale rigardi la lingvon. Mian intereson pri tia programado vekis fine la \u0109apitro pri logika programado en libro &#8222;Structure and Interpretation of Computer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-81","post","type-post","status-publish","format-standard","hentry","category-programado"],"_links":{"self":[{"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=\/wp\/v2\/posts\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=81"}],"version-history":[{"count":0,"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=\/wp\/v2\/posts\/81\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.esperantilo.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}