Esperantilo Blogo en Esperanto pri projekto Esperantilo kaj komputila lingvistiko

8.3.2008

i18n per Esperantilo

Filed under: maŝina tradukado,programado — artur @ 14:35

Esperantilo enhavas funkcion de traduka memoro kaj ankaŭ la specialan redaktilon por tradukado de teksto laŭ segmentoj (frazoj).
Esperantilo regas formatojn TMX kaj XLIFF. Ĝi povas legi formatojn HTML, XML kaj OpenOffice.
Ŝajnas tamen, ke preskaŭ neniu uzas tiujn funkciojn. Unue tiuj funkcioj estas por averaĝa uzanto tro progresinta, ke li ne bezonas ilin. Due la programo eble estas tro ŝarĝita per funkcioj, ke uzantoj estas malcertaj, por kio tiu programo taŭgas.
Eble kelkaj homoj pruvis tiun funkciojn, trovis erarojn kaj lasis tion. Mi nenion eksciis pri tio. Nun havis antaŭ kelka tempo kontakton kun uzanto de OmegaT. Tiu programo estas plej konata traduka programo en modo de libera programado. Esperantilo estas ankaŭ listigita en la listo de programoj, kiuj oferas tradukan memoron. Mi ne varbis por tiuj funkcioj kaj tiuj funkcioj ne estas tre fidindaj kaj ne vere finprogramitaj. En la dua flako tiuj funkcioj estas ankaŭ interesaj por Neesperantistoj. Tial oni povus varbi per tiuj funkcioj por esperanta lingvo. Almenaŭ kelkaj homoj, kiuj uzas tradukan memoron, ekscius pri tiu lingvo.
Lastajn semajnojn mi laboris pri plibonigo de tiuj funkcioj. Mi trovis kaj korektis multajn erarojn. Mi ŝanĝis ankaŭ la metodon de konservado de traduka memoro kaj vortaroj. Nun mi uzas sqlite datumbazon. Tio tre rapidigis la laboron de programo. La maŝina tradukado iĝis eĉ 6 foje pli rapida.

Tradukado de programoj

Esperanto enhavas potencan tradukan memoron kaj povas iel maŝine traduki de angla lingvo al esperanta lingvo. Do la programo povus esti interesa por tradukado de programaro. Mi rigardis kelkajn liberajn projektojn pri tradukado de programaro. Temas pri tradukado de angla lingvo al Esperanto.
Sekvaj projektoj estas plej grandaj kaj plej progresintaj:

Helpe de Translate toolkit mi kolektis ĉiujn tradukojn en unu grandega datumaro.
Mi aliformis la diferencajn formatojn por tradukado al XLIFF-formato. Poste mi importis ĉiujn XLIFF-dosieron al traduka memoro de Esperantilo. Tio daŭris kelkajn horojn.
Ne estis ankaŭ faĉile trovi ĉiujn fontojn de tradukadoj en la reto.
Fine mi havas 24MB grandan tradukan memoron kun 58.000 tradukitaj frazoj.
Estas interese, ke antaŭ 20 jaroj nur kelkaj registaroj de plej riĉaj landoj havis sufiĉe grandan komputilon por prilabori tiun amason da datumoj.
Tio estas bona fonto por sekvaj laboroj. Oni povas uzi tiun tekstaron tre diference.
Ĝi povus helpi ĉe traduko de aliaj programoj. Mi pensas ankaŭ pri aŭtomata kredo de vortaroj de tiu datumaro. Mi jam eksperimentis pri tio kun pola lingvo.

Antaŭ 4 jaroj, kiam mi komencis okupi pri komputila lingvistiko kaj Esperanto, tiu datumaro ne estis ebla. Estas tre ĝoige, ke Esperanto evoluas en libera programado. Tiu nuna bazo povus eĉ plirapidigi la disvastigon de Esperanto en tiu kampo.

Enkoduko – Kiel uzi Esperantilo por i18n

Unue instalu la plej novan eldonon de Esperantilo. Mi preskaŭ ĉiumonate pretigas novan plibonigitan eldonon.

Due ŝarĝu tm_en_eo.tmsql.gz la tradukan memoron por tradukado de angla al esperanta lingvo. Depaku tiun dosieron kaj kopiu ĝin al loko ~/Esperantilo aŭ sur Vindozo al dosierujo Esperantilo en dosierujo de uzanto (en angla eldono C:/Documents and Settings/uzanto/).

Lanĉu Esperantilon. Unue vi povas trarigardi la tradukan memoron. Tial vi ankaŭ provos, ke la importado de traduka memoro sukcesis. Agordu la fontan lingvon kiel angla lingvo kaj cela lingvo kiel Esperanto. Vi povas uzi por tiu menuon „Preferaĵoj->fonta lingvo“ kaj „Preferaĵoj->cela lingvo“ aŭ uzi la flagajn butonojn.

Flagoj en redaktilo

Lanĉu la redaktilon de traduka memoro per menuo: „tradukado->Traduka Memoro->redaktilo de traduka memoro“.

Redaktilo de Traduka Memero

Nun vi povas prepari la tradukadon de via ŝatata programo de angla lingvo al esperanta lingvo. Vi unue bezonas la fontan dosieron en formato XLIFF. Vi povas uzi la programon po2xliff de projekto Translate toolkit por transformi kutiman po-dosieron al xliff-dosiero.
Nun vi povas lanĉi la tradukan asitanton de Esperantilo.
Uzu por tio la menuon „Tradukado->Tradukado asistanto“.

asistanto de segmentilo

Vi povus ankaŭ lanĉi la redaktilon de xliff direkto de konsolo

./esperantilo.bin -segmentilo
./esperantilo.bin viadosiero.xliff

Vi elektu la fontan lingvon kiel angla lingvo (en) kaj celan lingvon kiel Esperanto (eo). Poste vi povas traduki la projekton per tn. traduka segmentilo.
Vi tradukas po unu elemento (segmento).
Kutime la programo pruvas traduki la frazon maŝine. Se ekzistas la traduko en traduka memoro, vi povas akcepti tiun tradukon.
Oni povas ankaŭ traduki la tutan dosieron aŭtomate per funkcio „Traduku al fino plenu aŭtomate“ aŭ traserĉi la tekston laŭ traduka memoro per funkcio „Prenu tradukojn de traduka memoro“.

XLIFF redaktilo

Trarigardo de tradukado

Nun mi kolekti pli ol 50000 tradukoj kaj havis okazon iom trarigardi tiujn tradukojn.
Mi unue serĉis la tradukon de „close window“ kaj trovis:

  • Fermu fenestron
  • Malfermu fenestron

Interesa eraro. Mi ankaŭ ĝin iam faris. Kaj poste nur „Close“ mi trovis

  • Fermi
  • Fermu

Mi mem preferas la ordonan formon, ĉe ja temas pri komando do ordono. Kutime oni tradukas en naciaj lingvoj tiujn komandojn kiel ordonoj. En germana lingvo oni uzas infinitivon („Schliessen“). Sed en germana lingvo oni ĝenerale ofte uzas tiun formon kiel ordono (senpersona ordono) „Arbeiten! Arbeiten!“, eble ankaŭ mallongigo de „Arbeiten Sie!“. Ankaŭ la angla lingvo uzas ordonon, la infinitivo estus „To close“.
Mi ŝatas la formon „u“, kiu ne nur estas ordono, sed ankaŭ povas esti sugesto.
Oni povus fari interesajn studojn sur tiu materialo.
Mi pensas pri aŭtomata kreado de vortaro.

Planoj (TODO)

Nun ekzistas multaj punktoj en programo, kiujn mi volas plibonigi. Mi rimarkis, ke mankas kelkaj funkcioj. Ekzemplo markilo por statuso de tradukado („akceptita“).

Fina vorto

Mi esperas, ke kelkaj homoj uzos Esperantilon por tradukado de programaro.

30.12.2007

Projekto Apertium

Filed under: maŝina tradukado,programado — artur @ 12:24

Antaŭ kelkaj tagoj unu de programistoj de projekto Apertium sciigis al mi, ke tiu projekto pri maŝina tradukado nun enhavas modulon, kiu tradukas el hispana lingvo al esperanta lingvo. Feliĉe la projekto apartenas al malfermaj projektoj, kiuj naskiĝis kiel universitata projekto. Mi povis senprobleme elŝuti, instali kaj detale trarigardi la projektojn. Tio estas tre ĝojiga afero, ĉar eĉ universitataj projektoj plej ofte estas fermaj kaj formortas. La projekto ekzistas kiel malferma projekto jam 2 jaroj, tamen mi frue ne sciis pri ĝi.

Apertium estas traduka modulo kaj aro de lingvistikaj iloj por malprofunda tradukado inter similaj lingvoj. Malprofunda tradukado signifas, ke la programo ne faras plenan sintaksan analizon de teksto. Tamen tio sufiĉas, ke 90% de frazoj estas tradukitaj bone inter similaj lingvoj. La projekto unue pritraktis la tradukadon inter la lingvoj: kataluna kaj hispana. Tiu tradukado estas nun ankaŭ uzata por maŝina traduko de artikoloj de iu hispana gazeto.

Nun la projekto subtenas multajn lingvajn parojn. Inter alie Hispana al Esperanto, aŭ Angla al Pola lingvo. Mi kalkulis 26 lingvajn parojn. La projekto evoluas tre vigle.

Pri teknikaj aferoj de tiu projekto oni pli bone legu la dokumentojn sur pago kun dokumentaro de projekto. Pli detalajn informojn oni trovas sur vikio de projekto.
La instalado de tiu projekto estas nuntempe eble nur sur Linukso kaj eble nur fare de iom sperta komputisto.
Ekzemple la traduka modulo de hispana al esperanta lingvo troviĝas nur en la SVN-programarkivo (repository). Oni devas mem elŝuti kaj instali en fiksa ordo kelkajn modulojn. La dokumentaro ne estas tre detala, kaj ofte ne plu aktuala. Do mi mem devis trovi, ke oni nun devas uzi la modulojn lttoolbox-unicode kaj apertium-unikode, kiuj havas internajn numerojn 3.0. Oni uzu ankaŭ la programon „apertium“ kaj ne „apetium-translation“, kiel tion priskribas malnova dokumentaro. Finfine mi sukcesis kompili kaj lanĉi la tradukadon. Mi ne konas la hispanan lingvon, do mi prenis iun hispanan tekston de la reto kaj tradukis ĝin al esperanta lingvo. La traduko estis komprenebla, tamen ekzistas multaj gramatikaj eraroj. Oni povas mem testi la programon direkte per la interreta interfaco.

Mi estis tre scivolema pri la tekniko de programo. La programo estas farita ĝenerale por multaj lingvoj. Tamen la programistoj plejparte prizorgis romajn lingvojn. Apartium estas programita helpe de C kaj C++. Ĝi uzas ofte la teknikon Finite state machine“. Ĉiuj lingvaj informoj estas unue enskribitaj en XML-formato. Poste la programo kompilas tiujn XML-dosierojn al maŝina formato. Por transformoj estas uzataj priskriboj en XML-formato, kiuj estas kompilitaj per yacc al C-programo. La uzado de programlingvo C/C++ kaj diversaj kompiloloj igas la programon tre rapida. Tre valoraj estas moduloj por morfema analizo kaj fleksio de vortoj. Tio estas tre praktika alveno al tiuj problemoj, kiu estas konata de operaciuma sistemo Unikso. La programo uzas la saman priskribon por ambaŭ taskoj. En la dosiero oni trovas la tutan difinon de esperanta fleksio. Por esperanta lingvo tiu dosiero ne estas sensacia, sed por naciaj lingvoj tiuj datoj estas tre valoraj, ĉar kutime la fleksio de naciaj lingvoj estas tre escepta kaj oni bezonas longan tempon por difini ĝin. La hispana-esperanta vortaro enhavas 12000 vortojn. La formato estas legebla por komutilo. Ekzistas aldonaj informoj pri genro kaj gramatiko. Tre bona laboro kaj vara lingva trezoro!

Laŭ mia nuna pritakso la projekto havas vere la ŝancon iĝi la Linukso de maŝina tradukado. Tion celis ankaŭ la iniciatantoj de tiu projekto. Tio povus sukcesi kaj jam multaj homoj laboras pri aldonaj lingvaj moduloj. Mi ankaŭ iom studis la tradukan modulon de angla lingvo al pola lingvo. Tiuj lingvoj estas tre diferencaj, kaj jam de priskriboj de aŭtoroj de projekto la programo ne estas konstruita por tradukado inter tiel malsamaj lingvoj. Pli bone estus la tradukado inter pola, ĉeĥa, slovaka kaj rusa lingvoj per Apertium. Ŝajne la bezono de tradukado inter pola kaj angla lingvoj estas tiel alta, ke eĉ la malsugestoj de aŭtoroj ne haltigas de evoluo de tiu modulo. Mi tute ne konas la hispanan lingvon, sed mi ankaŭ supozas, ke Esperanto kaj hispana lingvo ne estas idealaj lingvoj por malprofunda tradukado. Mi pensas, ke tiu projekto povus esti bona komenco por aliaj pli profundaj tradukadoj.

Nuntempe por kutima uzanto nur la interreta interfaco estas interesa. En la projekto mem ne ekzistas iu uzula interfaco (GUI). Sed tiu interfaco estas atendata de multaj uzantoj. Se tiu projekto estos daŭre tiel sukcesa, eble iam ekestos modulo por OpenOffice kaj aliaj interfacoj. Tio eble tre helpos al malferma programado de tiaj projektoj. Mi ne scias, ĉu oni povas kurigi la programon sur Vindozo. Mi supozas, ke oni devus adaptigi unue la kompilan sistemon por Vindozo.

La projekto Apertium havas multajn kondiĉojn, por esti sukcesa malferma projekto. Ĝi enhavas tre stabilajn ilojn, kiujn oni povas jam uzi. Hispana universitato subtenas la evoluon. Tio garantias, ke aroj de studentoj devige interesiĝas pri la projekto. La projekto estas jam sukcese uzata en realaj kondiĉoj. La sukceso estas la plej granda magneto de tiuj projektoj.

26.12.2007

Esperantilo sur OpenOffice

Filed under: programado — artur @ 11:27

La ĉefa malavantaĝo de Esperantilo por multaj uzantoj estas, ke tio programo ne estas dokumentoredaktilo, sed nur tekstredaktilo. Do ne eblas per Esperantilo formati kaj presi dokumentojn. Nur malmultaj spertaj pri komputiko uzantoj komprenas tiun diferencon. Mi ne celas ankaŭ fari de Esperantilo plenan dokumentoredaktilon, ĉar la programado de tiu sistemo estas por unu persono laboro por kelkcent jaroj.

Ekzistas jam bona libera dokumentoredaktilo OpenOffice, kiu estas bone konata en Esperantujo.
Tiu programo estas ankaŭ aktive tradukata al esperanta lingvo. Do estus tre nature kunligi funkciojn de Esperantilo kun OpenOffice. Kutime oni faros tion kiel tn. kromprogramoj (plugins) por OpenOffice.

Mi jam multe pli frue analizis eblojn de OpenOffice por integriĝo kun Esperantilo. Ekzistas ankaŭ aparta projekto de OpenOffice, kiu pritraktas gramatikan korektadon. La celo de tiu projekto estas ne programi novajn gramatikajn korektilojn, sed kunligi ekzistantajn ilojn kun OpenOffice.
Tiu tasko ne estas teknike facila. Unue la programistoj de OpenOffice devas pripensi, ke ekzistas gramatikaj korektiloj kaj poste oferi konvenan programan interfacon (angle: API) por tiuj iloj. Tiu API jam ekzistas de multaj jaroj, sed ne estas parto de aktuala OpenOffice. Ĝi estis priskribita tie kaj ankaŭ tie. Kiel oni legas sur paĝoj de OpenOffice tiu API estos parto de programo en eldono 2.4. Do tio estas la sekva eldono. Mi esperas, ke tio vere okazos.

La ĉefa problemo estas, ke la gramatika kontrolado devus esti parto de normala kontrolado. Simile al aliaj programoj, la gramatika kontrolado devus kuri en alia programa fadeno kaj ne ĝeni la normalan laboron kun programo. La malkorektaj vortoj aŭ vortgrupoj devas esti markitaj kaj uzanto povus per t.n. kunteksta menuo vidi la sugestojn de korekto.
La nuna API de OpenOffice pritraktas nur literumadon, tial la literumiloj ricevas per tiu API unuopajn vortojn kaj devas pritaksi, ĉu ili estas korektaj. Por gramatika kontrolado (ankaŭ aliaj pli vastaj kontroloj) oni devas analizi tutajn fragmentojn de teksto.
Tio estas tre komplika programado de OpenOffice, kiu postulus vastajn konojn de OpenOffice.
Tamen la projekto LanguageTool jam nun laboras kun OpenOffice. La integriĝo de tiu projekto ne estas tre bona, sed eble por nunaj ebloj la plej bona.

Mi do atendas la eldonon 2.4 de OpenOffice. Mi nun volas ekscii iom pri skribado de kromprogramoj (plugins) por OpenOffice.

Poste mi povos pensi pri aliaj funkcioj de Esperantilo, kiujn oni povos uzi de OpenOffice.
Mi pensas tie pri vortaroj kaj maŝina tradukado. Bedaŭrinde por maŝina tradukado ne ekzistas ĝis nun eĉ planoj por iu API en OpenOffice. La kaŭzo por tio eble estas, ke ne ekzistas multaj uzeblaj tradukaj sistemoj, do la programistoj de OpenOffice ne oferus API por io, kion neniu uzus. Oni ne povas pensi, ke programistoj de OpenOffice pensos iam pri iu malgranda projekto kiel Esperantilo. OpenOffice estas malferma sed ne amatora projekto, do la gvidantoj de tiu projekto certe pensas pri komerco.

23.12.2007

Nova versio de programlingvo Tcl 8.5

Filed under: programado — artur @ 10:33

Post 4 jaroj de laboro estis pretigita la nova version de lingvo Tcl. La programado de Esperantilo bazas sur tiu programa lingvo, kvankam la uzata programa lingvo estas la objektema plivastigo XOTcl. La nova Tcl enhavas kelkajn novajn kapablojn kaj estas pli rapida. Do ankaŭ Esperantilo povos profiti de tiu nova eldono.
La testas eldonoj de Tcl8.5 jam delonge ekzistis, sed mi ĝis nun ne provis ilin kun Esperantilo.
Esperantilo estas programita helpe de diversaj fremdaj moduloj kaj plivastigoj (angle: extensions). Tial la renovigo de tute programa medio ne estas facila.
Mi devis denove kompili kelkajn modulojn (XOTcl, mysqltcl, mk4tcl, sqlite, tdom, …)
Mi faris jam kelkajn testojn. Bedaŭrinde mi ne povus ruli Esperantilio sur Tcl8.5 sen kelkajn adaptojn.
Tamen mi planas uzi la novan eldonon en sekva tempo.
Por uzanto de Linukso la ŝanĝo estos videbla okulfrape. La nova Tcl (Tk) povas uzi specialajn formojn de literoj, kiu aspektas multe pli bone ol la malnova eldono (Legu pri Font Anty-Aliasing.

Esperantilo sur Linukso kun Tcl8.5

Mi volas fari ankoraŭ multajn testojn antaŭ mi eldonos Esperantilo surbaze de Tcl8.5.
Mi volas testi, ĉu vere la programo iĝis pli rapida helpe de Tcl8.5.

14.10.2007

Kiel programi maŝinan tradukadon por nova lingvo en Esperantilo?

Filed under: maŝina tradukado,programado — artur @ 10:48

Iafoje mi ricevas leterojn de uzantoj de Esperantilo, kiu dezirus maŝinan tradukadon al ilia nacia lingvo. Esperantilo nun subtenas la maŝinan tradukadon al 3 lingvoj, sed mi nuntempe okupas nur pri pola lingvo. Estas ĝenerale konata fakto, ke programado de maŝina tradukado ne estas triviala tasko. Alikaze ni delonge havus multajn altnivelajn tradukajn programojn por multaj lingvoj. Fakte nur kelkaj profesiaj firmaoj agas en tiu kampo kaj nombro de subtenataj lingvoj estas malgranda. Esperantilo ne estas planita por subteni dekomence multajn lingvojn. Do ĉiu nova subtenata lingvo bezonas novan planadon kaj programadon. Mi ankaŭ konscie okupis nur pri unudirekta traduko el Esperanto al nacia lingvo, ĉar tiu direkto ŝajnas havi malpli multajn obstaklojn pro trajtoj de esperanta lingvo. Mi tamen dekomence de programado planis la izolon de partoj de programo, kiuj estas dependaj de lingvo kaj partoj, kiuj estas ĝeneralaj pro maŝina tradukado mem. Tial la tradukado al tiuj 3 lingvoj uzas en 80% la saman programan bazon. Nur la plej specifaj fragmentoj estas programitaj en tn. traduka modulo por koncerna lingvo. Ankaŭ la proceso de tradukado mem ebligas la reuzon de grandaj partoj de programo por diferencaj lingvoj.

La proceso de programado estas

  1. Analizo de fonta teksto
  2. Kreado de tradukaj strukturoj
  3. Trovo de vortoj
  4. Gramatika transformigo kaj reordigo (Tiu parto dependas de cela lingvo)
  5. Kreado de rezulta teksto

Esperantilo enhavas ankaŭ multajn partojn, kiuj ne servas direkte en proceso de tradukado, sed tamen influas la kvaliton kaj la uzeblecon de tuta sistemo.
Tiuj partoj estas:

  • Pritrakto de diferencaj tekstaj formatoj (XML, HTML, OpenOfficem, Word)
  • Interaktiva tradukado
  • Traduka memoro
  • Administracio de vortaroj
  • Esperanta Vortfarado
  • Prilaboro de esperantaj tekstoj

Tial Esperantilo povus bone servi kiel baza sistemo por aliaj tradukaj sistemoj, ĉefe en direkto de Esperanta lingvo al nacia lingvo. Due oni povus reuzi la tradukan modulon de iu ekzistanta lingvo por krei tradukan modulon de similspeca lingvo. Ekzemple la traduka modulo de pola lingvo povus esti uzata kiel ŝablono por ĉiu slava lingvo. La germana kaj angla moduloj povus esti ŝablonoj por aliaj multnombraj germanaj lingvoj. Tamen mi ne kredas, ke la sintaksa analizo de esperanta lingvo en Esperantilo estus sufiĉa por traduko al lingvoj, kiuj tre diferencas de Esperanto. Temas precipe pri struktura (sintaksa) malsimileco.

Antaŭ ol vi decidis okupi pri maŝina tradukado

Maŝina tradukado postulas multajn konojn kaj vastan scion. Do oni devus longe prepari por tiu tasko. Oni devus eklerni multajn novajn kampojn kaj profundigi jam konatan scion. Do tio ne estas okupo por unu semajno aŭ iu instrua projekto. Tamen ekzistas sufiĉe multaj homoj, kiuj jam havas vastajn spertojn kaj delonge okupas pri tiu temo. Esperantilo estas io, kio povus esti interesa por homoj, kiuj volas havi ion praktikan. Ankaŭ kiel ŝatokupo estas eble en longa tempo fari ion, kio funkcias kaj havas trajtojn de tn. serioza aŭ profesia okupo. Por mi la atributo „profesia“ signifas nur, ke temas pri mono, kiun oni ricevas aŭ devas pagi. En tiu senco la sistemo Esperantilo ne estas profesia.

Mi povas helpi al ĉiu, kiu volas mem plukonstrui aŭ reuzi la sistemon Esperantilo, sed
mi devas dekomence substreki, ke la plej grandan laboron oni devus fari mem. Oni devas mem studi la komputilan lingvistikon, lerni programajn lingvojn kaj gramatikon. La projekto estas tute malferma kaj libera. Ĉiujn fontojn mi publikigas libere. Do oni ankaŭ povus sen mia helpo rekonstrui kaj adaptigi la sistemon por ĉies kialoj. Ekzistas multaj informoj en mia blogo kaj sur la TTT-paĝoj de Esperantilo. Ankaŭ pri aliaj teknikoj oni povas multe legi en interreto.

Due vi devas pripensi, ĉu vi eblas trovi sufiĉe da lingvistika materialo. Ĉu ekzistas liberaj glosaroj por koncerna lingvo? Ĉu ekzistas bonaj priskriboj de gramatiko? Ĉu aldonaj informoj pri fleksio ankaŭ estas uzeblaj? Mi ofte reuzas aliajn liberajn materialojn. La ideo „Programi tradukan sistemon tute de komenco“ estas tre malespera okupo.

EsperantiloSDK – Programa medio de programo Esperantilo

Por programi la programon Esperantilo mi uzas iom ne veste konatan programan medion. La baza programa lingvo estas Tcl. Eldone la programo estas skribita laŭ objektema maniero helpe de XOTcl. La programa medio estas XOTclIDE. Mi kredas, ke XOTcl kaj XOTclIDE ebligas la uzon de programa lingvo TCL en grandaj projektoj. Tiuj teknikaj iloj estas malofte uzataj. Sed la ideoj devenas de aliaj medioj, kiuj normale estas veste konataj. Do Tcl similas al C, Java kaj aliaj skriptaj lingvoj. XOTcl estas simila al Java, C++, Ryby kaj Python. Fine la programa medio XOTclIDE estas programita en tradicio de medioj por programa lingvo Smalltalk, kiuj influis ankaŭ aliajn programajn mediojn. Do sperta programisto ne trovas en tiu medio vere ion novan.

Mi preparis la tutan programan medion kiel EsperantiloSDK.
Vi povas facile instali ĝin sur vindozo kaj linukso. Sen aldonaj obstakloj vi povas uzi la programon, trarigardi ĝian programfonton kaj adaptigi kaj plivastigi ĝin.

Taskoj ĉe programado de nova traduka modulo

Oni povas tiujn laborojn distingi inter lingvistikaj taskoj kaj programaj taskoj.

Lingvistikaj taskoj

  • Kolektado de informoj pri gramatiko de cela lingvo.
    • Fleksio de substantivoj, verboj kaj adjektivoj
    • Fleksio de pronomoj
    • Projektado de fleksiaj grupoj kaj priskriboj en vortaro
    • Reguloj pri vortordo
    • Reguloj pri traduko de subfrazoj
    • Reguloj pri vortfarado
    • Korelativoj
  • Mana preparo de ekzemplaj tradukoj
  • Preparo de vortaro (vortlistoj kaj priskriboj)
  • Preparo de esceptoj en fleksio (ekzemple anglaj fortaj verboj: take, took, token)
  • Testado de sistemo

Programaj taskoj

  • Krado de nova traduka modulo kiel kopio de iu ekzistanta modulo
  • Programado de generatoro por fleksio
  • Programado de generatoro por numeroj
  • Programado de esceptoj kaj specialaj reguloj

Ellerno de sistemo. Praktikaj sugestoj

Jam en normala eldono de Esperantilo vi povas lerni iom pri proceso de tradukado.
Vi povas uzi tiujn funkciojn.

  • Menuo – Redaktu->Montru Sintakso – Analizo de fonta teksto
  • Menuo – Redaktu->Inspektu tradukon de frazo – Analizo de tradukado

sintakso-inspect

traduko-inspect
La sistemo XOTclIDE enhavas multajn ilojn por inspektado de programaj strukturoj kaj proceso de tradukado.
Se vi uzas la EsperantiloSDK, vi havas ankaŭ aldonajn eblojn.
La duopa klako en montrilo de sintakso sur iu elemento malfermigas tn. inspektan fenestron, en kiu
vi povas inspekti la variablojn kaj metodojn de iu elemento.
La proceso de tradukado estas bone priskribita en artikolo „Kiel komputilo tradukas?“.
Ekzistas ankaŭ multaj aliaj artikoloj pri tiu temo.


objektoinspektilo
Se vi jam scias ion pri programa lingvo Tcl, XOTcl kaj la programa medio XOTclIDE, vi povus tuj trarigardi la programfonton de programo kaj tuj adaptigi la sistemon en fenesto Component Browser. Atentu, ke XOTclIDE estas interaktiva sistemo. Tio signifas, ke vi samtempe povas kuri la programon kaj programi ĝin.

Konkretaj informoj pri programado

Se vi lanĉis EsperantiloSDK vi vidas fensetron de XOTclIDE, sed ankaŭ fenestro kun nomo EsperantiloCentro. De tiu lasta fenestro vi povas lanĉi la konatan redaktilon de Esperantilo kaj ankaŭ atingi kelkajn specialajn funkciojn per programado.


esperantilcentro
Por programado de maŝina tradukado estas gravaj subaj programaj moduloj.

Modulo Priskribo
EspSintaksaAnalizo Anazizo de esperanta teksto
EspTradukilo Bazaj funkcioj por tradukado
EspPlTradukilo traduka modulo por pola lingvo
EspDeTradukilo traduka modulo por germana lingvo
EspEnTradukilo traduka modulo por angla lingvo

Precipe vi devas „nur“ programi vian propran Esp??Tradukilo.

Tie vi povas vidi la priskrobjn de eroj de programo. Tamen mi sugestas trarigardi la fontprogramon kaj programan strukturon de Esperantilo tuj en EsperantiloSDK per modulomontrilo (angle: Component Browser).

Mi nun volas priskribi kelkajn teknikojn, kiujn vi povas uzi dum adaptado de modulo.

En ceteraj kazoj la vortoj de cela lingvo estas enmetitaj direkte en la programa fonto. Tial vi povas vidi la fremdlingvan vorton de la baza lingvo, kiu ne venas de vortaro, en la cela teksto.
Vi povas trovi facile la lokon en programo, kiu tion kaŭzis per serĉado de teksto en modulomontrilo.
Uzu la menuon (Method->Search Text->In Component.


method-search-which
Ofte iu metodo faras pli ol vi bezonas. Vi povas simple forigi la metodon (menuo: Method->Delete). La programo uzas en tiu kazo la pli bazan metodon kaj la programo daŭre funkcias.

Vi povas kompari metodojn de aliaj moduloj per funkcio (menuo: Method->Search Implementers.

La baza klaso, kiu respondas pri la tradukado estas FrazTraduko en modulo EspTradukilo. Vidu la metodon traduku.

Modulomontrilo

Ĉiuj vortoj estas objektoj, kiuj devenas de derivita klaso de la klaso TradukElemento.
Ekzemple ĉiu pola substantivo estas objekto de klaso ETPlSubstantivo.
Tiu klaso havas tiujn parencojn:

ETPlSubstantivo
  ETPlTradukElemento
  ETSubstantivo
    ElemTraduko
       ArboFolio
          ArboElemento

Vi povas rigardi la parencajn strukturojn per Heritage Browser, kiun vi lanĉas per
Class->Heritage Browser. Kiel vi vidas, la programo Esperantilo uzas konsekvence la objekteman programadon. La klaso „ETSubstantivo“ estas uzata en ĉiujn tradukajn modulojn kaj enhavas bazajn trajtojn de substantivo.


heritagebrowser
Se vi modifis unu metodon (funkcion) kaj ĝi ne funkcias, vi povas senprobleme reveni al malnova eldono. Do ni ne bezonas komenti aŭ malkomenti partojn de programo. Uzu la menuon: (Method->Version Control->$gt;Editions) aŭ (Method->Version Cotrol->Previous Version).

En ĉiu metodo, vi povas enmeti tn. haltpunkton (Breakpoint). Por tiu vi skribu en aldona linio: my halt. (Vi devas aldone enlegi la novan metodon per menu Edit->Save aŭ klavkombino Ctrl-S)
Se la programo denove uzas tiun metodon, vi povas inspketi la fluon de programo en sencimilo (debugger). Tiel vi ofte povus pli ekkoni pri programo ol nur legante la statikan programfonton. Vi povas pluruli la programon per butono Resume.


sencimilo

La preciza priskribo de tuta programo ne estas praktika. Pli bone estas lernia la programan lingvo kaj legi la programon direkte.

Kiel komenci?

Se vi estas preta komenci vian okupon pri programado de Esperantilo, kontaktu min. Eble mi povus fari la plej malfacilajn taskojn por la komenco aŭ doni al vi kelkajn rimarkojn.

12.9.2007

Maŝina tradukado el pola lingvo al Esperanto

Filed under: pola lingvo,programado — artur @ 18:46

Mi ne planis programi maŝinan tradukadon el pola lingvo, tamen nun mi dum longa tempo laboris pri tiu temo, kaj la venonta versio de Esperantilo enhavos unuan fojon la maŝinan tradukadon el pola lingvo al esperanta lingvo. La ĉefa kaŭzo pri mia frua rezisto je tiu temo estis, ke mi pritraktis la sintaksan analizon de pola lingvo kiel tre komplika, tro komplika por miaj rimedoj. Post kelkaj eksperimentoj mi konstatis, ke plena (profunda) sintaksa analizo ne estas tiel necesa por pola lingvo. Ekzistas ankaŭ la libera projekto morfologik kaj la s_fsa, kiuj oferas polan etiketilon. Do mi povis reuzi jam ekzistantan programaron. Tamen la vortprovizo de projekto morfologik, kvankam ĝi estas tre abunda, enhavis multe da eraroj. Do mi devis unue purigi tiun provizon. Por tiu tasko mi produktis de vortaro de Esperantilo ĉiujn fleksiajn formojn. Tiujn funkciojn mi jam bezonis por tradukado al pola lingvo. Feliĉe la laborkvanto ne estis tiel granda kaj mi povis rapide atingi unuajn rezultojn.

Ĉe tiu temo mi frontis unufoje la problemon de ambiguo de naturaj lingvoj. Por bona tradukado oni bezonas bonan senambiguilon (angle: disambigulation). La sendisambiguo koncernas ĉefe du problemojn.

  • Trovi la bazan vorton
  • Trovi unusencan gramatikan etiketon

Mi frue eĉ ne supozis, kiom da ambigueco ekzistas en pola lingvo. Mi pensas, ke nia cerbo faras tiun taskon tiel rapide, ke la ambigueco ne iĝas konscia. Do mi rimarkis tiun ambiguon nur dum la testado de tradukado.

Mi donas kelkajn ekzemplojn.

mam - verbo (mieć-havi), substatnivo (mama-patrino)
bez - konjukcio (sen), substantivo (sambuko)
jak - konjunkcio (kiel), substantivo (gruntbovo)

Ankaŭ la pola fleksio estas parte tre ambigua.

książki - baza vorto: książka
singularo, genetivo
pluralo, nominativo
pluralo, akuzativo

En pola lingvo akuzativo kaj nominativo por senvivaj substantivoj de vira genro estas samaj. Do mi devis uzi multajn diferencajn teknikojn por difini la gramatikan funkcion de vortoj en pola frazo. Pola lingvo havas ankaŭ komplikajn trajtojn ĉe negado kaj numeraloj. Jen la tabelo, kiu montras kelkajn defiojn de pola lingvo.

Ja mam książkę. Mi havas libron.
Ja nie mam książki. (genetivo-singularo) Mi ne havas libron.
Ja mam książki. (akuzativo-pluralo) Mi havas librojn.
Cena książki jest wysoka. (genetivo-singularo) Prezo de libro estas alta.

En tiu ekzemplo la vorto „książki“ devas esti tradukita depende de kunteksto al „libron, librojn aŭ de libro“.
Tamen ĉiujn tiujn frazojnj la programo nun povas korekte traduki. Do mi esperas, ke la tradukado el pola lingvo estus ankaŭ iam utila. Mi pensas, ke se la traduko estus komprenebla, tiam jam multaj esperantistoj povus kompreni polajn tekstojn. Do tiu direkto de tradukado estus eble pli interesa ol tradukado de Esperanto al pola lingvo. Tiu okupo estas pro mi bona okazo ekkoni la polan lingvon. Tiun scion oni nur tre malfacile atingas per legado de gramatikaj libroj. Eble ankaŭ la cerboj de polaj gramatikistoj malkaŝas al ili kelkajn gravajn fenomenojn de pola lingvo.

30.7.2007

Pola projekto Denise-Myth pri artefarita inteligento

Filed under: lingvistiko,programado — artur @ 18:43

Mi regule traserĉas la interreton je projektoj en la kampo de komputila ligvistiko. Nun mi trovis la projekton Denise-Myth. La projekto estis kreita kiel fina laboraĵo de pola universitato de Szymon Jessa. La celo de projekto estis krei la programon, kiu povus per natura lingvo komuniki kun uzanto kaj
krei bazon de kono (bazo de faktoj). La programo kolektas per dialogo kun uzanto informojn. Ĝi povas mem demandi. Fine la programo povas respondi je demandoj. Kvankam ĝenerale la problemo estas tre malfacila, la programo en komenca stato plenigas bone siajn taskojn. Ĝi povas analizi kaj kompreni simplajn polajn frazojn. Se oni povas bone demandi, la programo povas ankaŭ bone respondi. La programo regas ankaŭ la bazan logikon kaj povas rezoni. La aŭtoro de projekto devis solvi multajn problemojn. Ĉiu de tiuj problemoj estas por si mem tre ambicia kaj ĝis nun ne
sufiĉe solvita.
Tiuj problemoj estas:

  • Kompreno de natura lingvo
  • Konservado de faktoj en programaj strukturoj
  • Traserĉado de bazo de faktoj
  • Rezonado kaj provado de faktoj
  • Genero de respondoj en natura lingvo

Interesa estas ankaŭ la teknika aspekto de projekto. La problemoj estus kutime la domeno de altnivelaj lingvoj kiel prolog kaj lisp. Pro rezonado kaj konservado de faktoj la programa lingvo „prolog“ havas specialajn funkciojn, kiuj estas normala parto de tiu programa lingvo. Tamen la aŭtoro decidis programi en simpla programa lingvo „C“. Li volis, ke la programo rulos sur ĉiu ebla sistemo. Nun tre ofte sistemoj de altnivelaj lingvoj kiel: calm, prolog, schema, haskel, tcl, python kuras sur multaj operaciumaj sistemoj. Tio estas ebla, ĉar ili ofte esta programite en C, do tiu argumento ne estas pro mi tre konvinka. Mi supozas, ke aŭtoro simple tre ŝatis tiun programan lingvon. En bona maniero de programistoj la aŭtoro enmetas kompleksan logikon kaj multajn regulojn en specialjn dosierojn laŭ propra teksta formato. Por mi la plej interesa parto en tiu projekto estis la analizo de pola lingvo. Tiu tasko estas multe pli komplika ol analizo de esperanta lingvo, kiun mi programis en la programo Esperantilo. Bedaŭrinde la plena priskribo de analizo ne ekzistas kiel iu dokumento, do la nura eblo estas legi la programan kodon. La programo enhavas tabelojn kun finiloj de pola lingvo kaj povas de tiuj informoj mem derivi la kazon, arton kaj bazan formoj de vorto.
Tiu estas alia maniero de prilaboro ol la projekto de morfologik, kiu enhavas la grandegan bazon de ĉiuj eblaj polaj vortoj kun gramatika priskribo kaj baza formo. La kompleta sintaksa analizo ne estas farata, ĉar la programo akceptas nur kutimajn frazojn en kutima ordo de pola lingvo. La faktoj estas konstruitaj helpe de tiel nomataj ŝlosilaj vortoj kiel: „esti“, „signifi“, „estas parto de“. La programo me povas rekoni ĉu la uzanto aldonas novan fakton aŭ ĉu ili demandas pri io. La programa teksto ne estas eĉ tro longa kaj tamen funkcias por siaj celoj.
Interesa fakto en tiu projekto estas, ke en bazo de faktoj la ĉefan rolon havas subjekto. Aŭtoro diras pri tn.
lineaj frazoj. Do la programo transformas la sintaksaj arboj de frazo al lineaj strukturoj. Laŭ tiu modelo la frazo: „Roberto iras rapide sur la vojo“ havas 2 lineaj frazojn: „Roberto iras rapide“ kaj „Roberto iras sur la vojo“.
La kutima semantika prezento de tiu frazo estas: iri(Roberto,sur(vojo),rapide). Do predikato havas la unuan pozicion. En la sistemo Denise tio estus Roberto -> iri -> rapide.
Kial la aŭtoro elektis alian metodon? Ĉu ekzistis la kultura kialo por tio? Mi pensas, ke por slavoj la substantivo estas pli grava elemento de frazo. En rusa lingvo kutime mallongaj frazoj tute ne havas verbon (ekzistas do nur latenta predikato).
La laboraĵo donas ankaŭ multajn ekzemplojn kiel ekstrakti logikaj faktoj de frazoj. La programo povas rezoni laŭ logikaj reguloj kaj regas la vortetojn: „iu, ĉiu, neniu“. Mi iom ludis kun la programo, kaj povas eĉ kelkfoje ricevi veraj informoj. Tio estas tre ĝoiga sperto.

Projekto Cyc

Dum la legado de laboraĵo mi ankaŭ eksciis pri pli fama projekto Cyc. La celo de tiu projekto estas la kolekto de ĉiuj faktoj de baza nivelo.
Ekzemple:

  • Homo, kiu studas, estas studanto.
  • Oni studas en universitato.
  • Studanto estas homo.

Tiu bazo povus servi por krei programon, kiu mem elektos informojn de tekstoj en natura lingvo. Poste la sistemo povos mem derivi novajn faktojn de konataj faktoj. Ĝi povos respondi je ĉiuj demandoj. La sistemo estas nun evoluita dum multaj jaroj kaj jam povas funkcii kaj plenumi planitajn taskojn. Do eĉ kompleksa rezonado funkcias.
La bazo de faktoj estas libere atingebla. Tiuj faktoj (precipe ontologio) estas tre similaj al projekto WordNet.
Ankaŭ en maŝina tradukado la aŭtomata kompreno de teksto estas tre grava por bona kvalito de traduko. Mi pensas, ke kun metodoj de similaj programoj kaj bazoj de sistemoj CycWordNet la kvalito de tradukado povos atingi la akcepteblan kvaliton. Tie la vorto „akceptebla“ signifas, ke la maŝina tradukado estas same bona kiel la homa tradukado.

Kvankam oni nun pensas, ke komputiloj neniam povus kompreni tekstojn en natura lingvo, tio tamen iom post iom okazas.
„Komprenado“ en tiu kazo ne estas egala al homa komprenado. Tamen maŝinoj povas kolekti faktojn de tekstoj kaj rezonadi sur bazo de tiuj faktoj. La laboraĵo de Szymon Jess enhavas kelkajn interesajn pensojn pri tiu temo. Se mi observas la serĉmaŝinon „Google“, mi pensas, ke nun ĝi estas la plej granda leganto de interreto. Tiu sistemo laboras nun laŭ tre primitivaj metodoj, tamen tiuj metodoj pliboniĝas konstante. La celo de google ne estas kompreno, sed komerca varbado, tamen iam tiu funkciado similos al komprenado.

Nun tekniko kaj interreto helpos al Esperanto ĉe ĝi evoluo kaj disvastigado. Sed la evoluo de tekniko povus signifi ankaŭ la morton de Esperanto. Tio okazos, kiam la komputiloj povus kompreni tekstojn, kaj estos mem la plej grandaj legantoj de tekstoj. Tiuj programoj plej verŝajne komprenus unue nur kelkajn lingvojn. Tiuj lingvoj certe estos: „angla, franca, japana, ĉina, germana, …“.

12.7.2007

Aŭtomata raportado kaj informado per interreto

Filed under: ĝenerale,programado — artur @ 18:39

La projekto Esperantilo estas evoluigita de unu persono. Tio estas preskaŭ normala afero ĉe liberaj programoj.
Tamen multaj homoj partoprenis iugrade ĉe la projekto per raportoj aŭ sugestoj. La nombro de tiuj raportoj ne estas granda.
Mankas erarraportoj, kiuj multe helpus al la projekto. Ankaŭ ĝis nun mi ne ricevis neniujn korektojn de vortaroj, kvankam la programo
mem ebligas adapti la vortaron kaj la ŝanĝoj povus esti eksportitaj per funkcio „preferaĵoj->konservu lokajn ŝanĝojn por eksportado“.
Mi pensas, ke ofte homoj ne scias pri tiuj ebloj aŭ tia partopreno en projekto estas tro klopoda. De informoj, kiuj mi ricevis de uzantoj, mi supozas, ke spertaj esperantistoj ne bezonas la programon kaj komencantoj simple ne kapablas helpi aŭ raporti. Do mi devus atendi la tempon, kiam kelkaj nunaj komencantoj iĝos spertaj kaj havos emon raporti :-). Eble la programo havas tro da eraroj kaj la uzantoj pensas, ke ne indas raporti. Mi tute pri tio ne scias.

Komercaj firmaoj, kiuj laboras pri programaro por vasta publiko, havas tute aliajn rimedojn. En tiuj projektoj partoprenis multaj personoj, kiu prizorgas nur pri unu kampo de kreado. Do ekzistas: fakaj specialistoj, testantoj, specialistoj pri varbado, projektantoj, gvidantoj kaj fine programistoj.

Projekto Esperantilo havas subajn problemojn en tiu kampo.

  • Mi ricevas tro malmulte da eraraj raportoj. (Ĝis nun ĉirkaŭ 10)
  • Due mi tute ne scias, kiel homoj uzas la programon. Kiuj funkcioj estas uzataj kaj ŝatataj kaj kiuj funkcioj neniam estas uzataj?
  • La komuna prilaboro de vortaroj ne funkcias.
  • La eraroj (cimoj) en programo povas esti korektitaj nur per nova eldono. Ne ekzistas la eblo de instalado de flikoj (angle: patch).
  • Uzantoj uzas verŝajne ofte malnovan eldonon de programo kaj malofte refreŝigas la programon.
    Tiu estas eble tre verŝajna, ĉar preskaŭ ĉiun duan monaton ekestos nova eldono de programo kun malgrandaj ŝanĝoj.

Kelkaj novaj programoj kiel Firefox aŭ OpenOffice ankaŭ frontas tiujn problemojn. La solvo de tiuj programoj estas, ke la programo uzas interreton por aŭtomate ricevi aŭ sendi informojn. Mi nun testas kelkajn eblojn. Tiuj estas:

  • Direkta raportado de eraroj per interreto.
  • Rapida kaj aŭtomata instalado de programaj flikoj (sen granda elŝuto de tuta programo).
  • Aŭtomata informado pri nova eldono de Esperantilo.
  • Facila sendado de ŝanĝoj en vortaro.
  • Statistiko pri uzado de programo.

Tiaj funkcioj frue ne estis akceptitaj de uzantoj. Oni precipe ne volis, ke programo mem kontaktis servilon per interreto kaj sendas iujn informojn. Sed nun preskaŭ ĉiuj programoj uzas tiujn eblojn. Nuntempe preskaŭ ĉiu komputilo estas daŭre konektita kun interreto.
Ofte multe uzantoj ne havas tempon por lerni pri tiuj ebloj de programo. Ili estas nur maloftaj uzantoj de komputiloj kaj ne scias pri maniero de libera programado. Do ekzistas verŝajne granda grupo de uzantoj, de kiuj mi ne ricevis neniun informon. Mi planas, ke tiujn novajn funkciojn oni povas influi per agordo de preferaĵoj. Kutime uzantoj tamen neniam tuŝas preferaĵojn.
Mi esperas, ke tiuj funkcioj, kiuj ja estas konataj de aliaj programoj, estos bonvenigitaj de uzantoj.

22.6.2007

Ludoj kun programlingvo „prolog“

Filed under: programado — artur @ 18:21

Prolog estas programa lingvo, kiu bazas sur predikatkalkulo. Onidire tiu lingvo havas mirindajn eblojn kaj estas uzata por artefarita intelekto kaj ankaŭ en lingvistika programado. Tio estas por mi la kaŭzo pli detale rigardi la lingvon. Mian intereson pri tia programado vekis fine la ĉapitro pri logika programado en libro „Structure and Interpretation of Computer Programs“ de Harold Abelson, Gerlald Jay Sussman kun Julie Sussman. La prezentita algoritmo nomiĝas angle „unification“. Mi iam ankaŭ en mia ŝtudperiodo provis prologon, sed tiam mi ne sukcesic kompreni pli ol la konata ekzemplo kun familio.

Feliĉe en nuna tempo oni per interreto tre facile povas trovi liberan programaron kaj dokumentaron. Do mi instalis SWI-Prolog kaj komencis legi la instruan interetan libron pri prologo
(Lern Prolog Now!).

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ŭ tre avantaĝa por prilaboro de arbaj strukturoj kaj listoj. Kvankam en prologo oni ŝajne 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ŭ la ordo de reguloj. Ne estas ankaŭ tre facile kompreni la rekursion en tiuj reguloj. Sen mia okupo pri lingvo Scheme mi preskaŭ ne havus ŝancojn kompreni la principon de akumulatoro ĉe rekursio. Mi pensas, ke sen scio pri funkciaj lingvoj kiel „Lispo, Scheme“ oni tre malfacile povus kompreni prologon. Insterese, ke mi retrovis ĉe tiu kazo la saman ekzercon kiel ĉe ŝemo, kiu pritraktas la reversadon de listo kun kaj sen akumulatoro

;; naiva programado
naiverev([],[]).
naiverev([H|T],R) :- naiverev(T,RevT),append(RevT,[H],R).
;; kun akumulatoro
accRev([H|T],A,R) :- accRev(T,[H|A],R).
accRev([],A,A).
rev(L,R) :- accRev(L,[],R).

;; la sama tasko en ŝemo.
;; invert : (listof X)  ->  (listof X)
;; to construct the reverse of alox
(define (invert alox0)
  (local (;; accumulator is the reversed list of all those items
	  ;; on alox0 that precede alox
	  (define (rev alox accumulator)	
	    (cond
	      [(empty? alox) accumulator]
	      [else
		(rev (rest alox) (cons (first alox) accumulator))])))
    (rev alox0 empty)))

La programo en prologo estas mirinde mallonga eĉ ĉe komparo kun ŝemo. Por mi nova estas en prologo la fakto, ke mi aŭ tuj sukcesas difini korektan regulon aŭ mi longe pensas pri 2 linioj de programo. Ekzemple mi tre longe pensis pri ekzerco 6.3.
La tasko estis: Difinu la regulon swapfl/2 kiu pruvas ĉe du listoj estas samaj, krome ke la unua kaj ka lasta elemento estis interŝanĝitaj.

swapf([1,2,3,4],[4,2,3,1])
 Yes
swapf([1,2,3,4],[1,2,3,4])
 No

La ekzerco sugestis uzi la predikaton append/3. Kaj antaŭaj ekzercoj prilaboris la predikaton final(X,List), kiu testas, ĉu X estas la fino de listo L. Do mia unua provo estis.

final([F],F)
final(F,[H|T]) :- final(F,T).
swapf([H1|T1],[H2|T2]) :-
  final(H2,T1),
  final(H1,T2),
  append(R,[H1],T2),
  append(R,[H2],T1).

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.

35 ?- swapfln([1,2,3,4],[4,2,3,1]).

Yes
36 ?- swapfln([1,2,3,4],X).

X = [4, 2, 3, 1] ;

Action (h for help) ? abort
% Execution Aborted

Mi longe penis, kiel plibonigi tion. Fine mi difinis la regulojn kun rekursio kaj akumulatro.

swapflInner([End],[Begin],Begin,End).
swapflInner([E|T1],[E|T2],Begin,End) :- swapflInner(T1,T2,Begin,End).
swapfl([H1|T1],[H2|T2]) :- swapflInner(T1,T2,H1,H2).

Tiu difino sukcesis ankaŭ 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ĉajn embuskojn. Mi povas imaĝi, ke de iu grando la flegado de tiuj programoj estas tre malfacila kaj bezonas longan sperton. Por mi ankoraŭ stranga estas la funkciado de predikato rek/2.

;; en tiu direkto funkcias ĉio
2 ?- rev([1,2,3],X).

X = [3, 2, 1] ;

No
;; en alia direkto okazas eraro
3 ?- rev(X,[1,2,3]).
ERROR: Out of local stack
   Exception: (209,511) accRev(_G1257054, [_G1257053, _G1257047|...], [1, 2, 3]) ? 

Do ŝajne en prologo oni devas zorge pripensi, kien oni povas enmeti variablojn. En la instrua libro oni tamen neniam pri tio diris kaj ŝajne komentarojn kaj priskriboj de predikatoj ne estas kutimaj.

Nun mi daŭre lernos tiun lingvon kaj mi volas apenaŭ vidi kelkajn ekzemplojn pri lingvistika programado per prologo. Interesa estas ankaŭ por mi vidi la programojn, kiuj estas taŭgaj por reala mondo. Do programoj, kiu havas uzulan interfacon aŭ prilaboras dosierojn. Feliĉe la labormanieron de prologo oni povas uzi de ankaŭ en aliaj lingvoj. Ofte medioj por prologo ebligas la komunikadon kun programoj skribitaj en C kaj Java. Ekzistas ankaŭ moduloj por javo, kiu ebligas la uzadon de logika programado. Ofte tiuj moduloj estas uzataj por difini kaj traserĉi bazojn de datumoj.

leciono por Esperantilo

Certe de programlingvo prolog oni povas lerni multon ankaŭ por aliaj programaj lingvoj. La ĉefa algoritmo de prologo, kiu estas „unification“ oni povas ankaŭ programi en aliaj lingvoj. Ankaŭ ekzistas ekzempla programado por Tcl. Mi pensas, ke per metodoj de prologo, oni povus tre pure difini la regulojn por serĉado kaj transformigo de sintaksaj arboj. Penseblaj estas reguloj por gramatika korektilo, kiuj estas difinitaj laŭ logika maniero.

Nun reguloj aspektas kiel sube:

match {
      folioj {
         OR {b kilogramo b kvanto b litro b amaso b metro}
         v de
      }
}

Tiu lingvo estas tre simila al prefiksa predikata matematiko (+ 2 2) kiu estas uzata en ŝemo. Tio nun sufiĉas por facilaj reguloj.
Esprimo (v de) signifas = (folio de sintaksa arbo, kies vorto estas „de“). 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 DLT projekto uzis prologon por tiu tasko. Mi havas dubojn pri tio, ĉu vere prologo estas tre taŭga por tiu celo. Unue oni plej ofte interesas ne pri ĉiuj eblaj analizoj sed nur pri unu analizo, kiu estas la plej verŝajna. Due oni volas havi la rezultojn de analizo, eĉ se la plena korekta analizo ne estas ebla. Tial la labormaniero de prologo, kiu estas „top-down“ ne estas avantaĝa. Mi pensas ankaŭ, ke difino de esceptoj de natura lingvo (ankaŭ de Esperanto) povas esti tre malfacila en prologo. Mi ĝis nun ne trovis la pritakson de tiu problemo kaj estas tre neverŝajne, ke tio ekzistus por Esperanto. Ŝajne ĉiuj nunaj sintaksaj analiziloj ne plu uzas prologon aŭ logikan programadon. Eble la ĉefa kazo estas la rapideco de tiuj programoj. La alia kampo estas la difino de semantikaj retoj. Tio ŝajne 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 datumbazoj. Semantikaj retoj estas kondiĉo por pli bona maŝina tradukado.

Ne estas facila tasko tralabrori la abundan teorion kaj enprogrami tion en la taŭga 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.
Avantaĝe estas, ke pro interreto nun eĉ la neprofesiulo kiel mi havas la senpagan aliron al modernaj programoj kaj dokumentaro.
Ankaŭ hodiaŭaj hejmaj komputiloj estas sufiĉe rapidaj por tiaj taskoj.

4.5.2007

Programlingvo „Scheme“

Filed under: programado — artur @ 19:05

Mi ĝenerale interesiĝas pri programaj lingvoj (vidu: enciklopedio de programaj lingvoj) kaj mi lernis kaj provis multe da ili. Unu el la plej malnovaj kaj elstaraj lingvoj estas Lispo. Oni ofte mencias Lispon en diferencaj libroj, sed mi neniam vidis, ke iu uzis tiun lingvon profesie aŭ praktike. Mi jam kelkfoje provis programi ion per Lispo, sed mi ĉiam malsukcesis. La unua problemo estas la elekto de programa medio. Ekzistas multaj Lisp-dialektoj kaj ili ofte tre diferencas. Tiuj programaj medioj por Lispo ne estas ankaŭ komfortaj por uzantoj. Ili havas kutime uzeblecon de unuaj enigmaj programoj de 70-aj jaroj. La erarmesaĝoj estas enigmaj kaj mi ne sukcesis lerni la lingvon. La dokumentaro por Lispo preskaŭ ne ekzistas por iu konkreta medio. La plej konata estas la programo Emacs. Do oni ne povas direkte programi laŭ iu libro aŭ dokumentaro, ĉar la ekzemploj ne funkcias por tiu dialekto, kiun ni ĵus uzas. Tamen en literaturo ekzistas fantastaj priskriboj de eblecoj de tiu lingvo. En unuaj libroj, kiujn mi legis pri Lispo la ekzemploj estis tre matematikaj kaj ofte jam post unu paĝo tre abstraktaj. Mi pensas, ke la ĉefa kaŭzo pro tio estis, ke la aŭtoroj de tiuj libroj mem konstruis la programan lingvon kaj interesiĝis nur por kelkaj aspektoj de lingvo, sed ne pri praktika apliko. Do mi neniam sukcesis konkrete solvi problemojn per tiu lingvo. Mi pensas ankaŭ, ke la precipa solvmaniero de prilaboro per rekursio estas por multaj hodiaŭaj programistoj tute ne konata (Ekzemplo de iu komputila diskutgrupo). La strikte matematika pensmaniero ne estas ankaŭ praktika por programado, ĉar la rezultaj programoj simple estas tro malrapidaj. Ekzemple mi tre miris pri la solvo de problemo, ĉu iu nombro estas para aŭ malpara. Por matematikisto estas evidente, ke

  1. 0 estas para nombro
  2. n estas para, se n-1 estas malpara
  3. n estas malpara, se n-1 estas para
(define (para? n)
   (cond
     [(= n 0) true]
     [else (malpara? (- n 1))]))
(define (malpara? n)
   (cond
      [(= n 0) false]
      [else (para? (- n 1))]))

La programo estas genia, sed se oni pensas, kion faras la komputilo sur tre baza nivelo por plenumi la kalkuladon, tiam oni rimarkas, ke tiu solvo ne estas taŭga. Mi frue programis en Asemblo kaj C. Tial mi scias, ke la plej rapida solvo en alia lingvo estas la testado de lasta bitumo. Ĉar la nombroj jam estas en bituma reprezento, tiu operacio estas tre tre rapida. Do mi precipe konas la funkciadon de komputilo kaj ĝiajn limigojn.
boolean estasPara(int n) { return n & 1 == 1 ? false : true; }
Tamen por granda parto de problemoj Lispo oferas tre abundajn eblojn de abstraktado, kiu helpas tre elegante difini la programon. Mi legis la blogan artikolon The Perils of JavaSchools – Joel Spolsky, kaj tiu artikolo denove vekis mian intereson pro Ŝemo (angle Scheme) (programa lingvo, kiu estas modernigita Lisp). La aŭtoro de tiu artikolo tre bedaŭras, ke hodiaŭaj Java-programistoj ne komprenas tre gravajn konceptojn de informatiko kaj ne kapablas nek programi en tre baza nek en tre abstrakta nivelo. Mi trovis ankaŭ la programan medion DrScheme kaj instruan retan libron How to Design Programs An Introduction to Computing and Programming. Tiu estas vere la unua medio por Ŝemo kaj instrua libro por tiu lingvo, kiuj estis farita por normalaj mortemuloj. Finfine ekzistas bona libro, kiu klarigas la programadon per Ŝemo. Do mi malrapide tralaboras la libron kaj povas per ekzercoj kaj la programa medio tuj apliki la novan scion. Post kelkaj ekzercoj mi vere devas konfesi, ke Ŝemo estas tre eleganta lingvo.

Mi eĉ komprenis kaj mem programis kelkajn variantojn de QuickSort. Mi rimarkis, ke la programo bezonas multe da labora memoro (120 MB) kaj ne estas tre rapida. Tamen, kompare al Java, tio ne estas surpriza afero. DrScheme estas ankaŭ programita por instruaj kialoj kaj rapideco ne estis ilia plej grava trajto. Ekzistas ankaŭ alia libera eldono de Schema, kiu estas eble pli rapida kaj memorŝpara. Tiu estas programo Guile. Kvankam tiu lingvo havis tre fortan aprobon de konata programisto Richard Stallman, ĝi ne estas tre populara kompare al aliaj tn. skriptaj lingvoj.

Mi pensas, ke programado per tiu lingvo estas tiom alia kaj dokumentaro tiom malbona, ke la plejparto de programistoj tute ne havas ŝancojn lerni ĝin. Rimarkinde neniu granda firmao subtenas tiun lingvon kaj precipe funkciajn lingvojn. Nur lastatempe Microsoft en sia .NET subtenas la lingvon OCalm sub nova nomo F#, kiu havas similajn trajtojn kiel Ŝemo. Ankaŭ tiu subteno havas ĝis nun nur akademian karakteron. Do eble tiuj funkciaj lingvoj iam estos ankaŭ gravaj por profesia programado.

Ekzistas ankaŭ alia libro pri la programlingvo Ŝemo Structure and Interpretation of Computer Programs. Sed tiu libro ankaŭ apartenas al libroj, kiujn oni kiel novulo maleble povas kompreni. Mi esperas, se iam mi ankaŭ povus iam legi kaj kompreni ankaŭ tiun libron.

Fine mi sukcesis eklerni Lispon (kiel Ŝemo). Por programistoj tio estas kvazaŭ la sekva ŝtupo de informadika scipovo.

« Newer PostsOlder Posts »

Powered by WordPress