sunnuntai 19. lokakuuta 2008

PEG - kielioppi

Minulla on ensimmäisen vaiheen toteutus hyvässä (rauhallisessa) vauhdissa. Ihan maistiaisiksi esittelen raakile-kieliopin lojban-teksteille. Näen jo, että siinä on puutteita ainakin tiettyjen "terminaattoritapausten" tunnistamisessa. Mutta haluan täydentää ja päivittää sitä iteratiivisesti, koska sen koko kasvaa joka tapauksessa ainakin viisikertaiseksi, ennen kuin se tukee "koko lojban-kieltä". Täydelliseen PEG (Parsing Expression Grammar) -kielioppiin verrattuna on huomioitava, että tämä kielioppi ei etene merkkitasolle asti, vaan teen "tokenizing"-operaation ensin, eli erittelen bridin sanat toisistaan. Lisäksi käytän erikoisfunktiota esim. tunnistamaan gismut.

Toinen kielioppi on edellisen kieliopin "metakielioppi", jonka avulla luen ohjelmallisesti ajonaikaisesti tuon lojban-kieliopin ja alustan "sääntöoliot" metakieliopin suorittaman parsimisen tuloksena. Metakielioppi sen sijaan on C++ -tasolla "kovakoodattu"


//
// PEG Grammar for a small subset of lojban language
//
// V.0.1
//
// ========= Notation =========
//
// [Symbol] := [Rule]
// &( ) and predicate
// !( ) not predicate
// ( )+ one or more
// ( )* zero or more
// ( )? zero or one
// E1 | E2 ordered choice
// E1 E2 sequence
//
//

// High level syntax

EBridi := (EBridiStart)? EBridiBody (EConnBridi)* // multiple connected bridi
EBridiStart := ".i" | "ni'o" // bridi start cmavo
EConnBridi := EBridiConnective EBridiBody // connected extension
EBridiConnective := ".ije" | "ri'a" | "ki'i" // bridi connectors
EBridiBody := (EBridiComp)+ // multiple
EBridiComp := ESumtiComp | ESelbriComp // Sumti- or selbri-phrase

// Selbri syntax

ESelbriComp := ("cu")? (ESpatiTempAttr)? (EConversCmavo)? EBrivla
EConversCmavo := "se" | "te" | "ve" | "xe"

// Sumti syntax

ESumtiComp := ESumtiPhrase | ESumtiTcita
ESumtiPhrase := ESingleSumtiPhr (EConnectedSumti)?
EConnectedSumti := ESumtiConnective ESingleSumtiPhr
ESumtiConnective := ".e" | ".a" | "joi" | "ce" | "ce'o"
ESingleSumtiPhr := (ESpatiTempAttr)? (ESumtiObject) (EIndirectDescrip)?
ESpatiTempAttr := "mu'o" | "ca" | "pu" | "ba" | "vi" | "va" | "vu" | "ga'u" | "ni'a" | "ca'u" | "ti'a"
ESumtiObject := EProSumti | ENamePhrase | ESelbriPlace | EAbstraction
EProSumti := "ko'i" | "ko'a" | "ko'e" | "fo'a" | "ri"
ENamePhrase := "la" EName (EProSumAssign)?
ESelbriPlace := (EPlaceTag)? EBrivlaEpress (EProSumAssign)?
EBrivlaEpress := EArticle EBrivla
EPlaceTag := "fa" | "fe" | "fi" | "fo" | "fu"
EArticle := "lo" | "le" | "lo'i" | "lei" | "le'i"
EBrivla := EGismu | ELujvo
EProSumAssign := "goi" EProSumti
EAbstraction := EArticlAbstract EAbstrPhrase
EArticlAbstract := "lenu" | "lonu"
EAbstrPhrase := EBrivla | EBridiBody
EIndirectDescrip := EAssosiation | ERelativeClause
EAssosiation := EAssosCmavo ESingleSumtiPhr
EAssosCmavo := "pe" | "po" | "po'e" | "po'u" | "ne" | "no'u"
ESumtiTcita := ESpatiTempAttr ESpatiTempExpr
ESpatiTempExpr := EAbstraction | EBrivlaEpress
ENamePhrase := ExplicitFunction_N
EGismu := ExplicitFunction_G
ELujvo := ExplicitFunction_L




//
// PEG Grammar for the PEG Grammar syntax
// "a meta grammar"
//
// V.0.1
//
// ========= Notation =========
//
// [Symbol] := [Rule]
// &( ) and predicate
// !( ) not predicate
// ( )+ one or more
// ( )* zero or more
// ( )? zero or one
// E1 | E2 ordered choice
// E1 E2 sequence
//
//

EGrammarLine := ECommentLine | ERuleClause
ECommentLine := "//" ECommentText
ERuleClause := ESymbol ":=" ERule (ECommentLine)?
ERule := ESequence | EChoice
ESequence := (ESequenceTerm)+
EChoice := EChoiceTerm EMoreChoice
ESequenceTerm := ESimppelTerm | EOperatorTerm
ESimppelTerm := ESymbol | ETerminal
EOperatorTerm := EZOne | EZMore | EOneMore | ENot | EAnd
EZOne := "(" ESimppelTerm ")?"
EZMore := "(" ESimppelTerm ")*"
EOneMore := "(" ESimppelTerm ")+"
ENot := "!(" ESimppelTerm ")"
EAnd := "&(" ESimppelTerm ")"
ESymbol := ExplicitFunction_S
ETerminal := ExplicitFunction_T

tiistai 14. lokakuuta 2008

Loebner Prize 2008

Loebner Prize 2008 -kisat on saatu päätökseen ja ainakin yhden analyysin mukaan se päivä on lähellä, jolloin joku osanottaja-botti häämää tuomareita riittävästi selviytyen kisan versiossa "Turing testistä".

http://technology.timesonline.co.uk/tol/news/tech_and_web/article4934858.ece

Kisassa siis tuomarit yrittävät selvittää kuka "teletypeyhteyden" päässä olevista on oikea ihminen ja kuka on tietokoneohjelma.
Mutta jos vaikka ensi vuonna joku ohjelma osaa viisi minuuttia hämätä riittävän montaa tuomaria ja voittaa pääpalkinnon, en silti noteeraa tätä "ihmisveroisena älykkyytenä". Olen tätä mieltä siksi, että valitettavasti tällaisessa kilpailussa pärjää paremmin erilaisilla hämäystaktiikoilla kuin yrittämällä luoda oikean kognitiivisen järjestelmän. Luulen, että kilpailun suurin virhe on juuri se, että koneen pitäisi valehdella olevan ihminen. Miksi valehtelu palkitaan? Kuvaako se jotenkin, tahattomasti, kulttuuriamme?

Minusta pitäisi kehittää uusi versio kilpailusta, jossa heti tiedetään kuka on ohjelmisto ja ja kuka oikea ihminen, mutta kaikille teetetään oikeita tehtäviä eikä smalltalk-keskusteluita. Ja jos ohjelmisto selviää luovaa, sponttania verbaalisesti käynnistettyä asiakokonaisuuksien omaksumista ja niihin liittyvää ongelmanratkaisua sisältyvistä monipuolisesta tehtäväjoukosta paremmin kuin inhimillisten referenssikipailijoiden enemmistö, niin ohjelma on kognitiivisilta kyvyiltään ihmisen tasolla. Smalltalk-tasoista (iltapäivälehti-) yleistietoa ei saisi edellyttää, koska se ei voi olla tärkeää. Luonnontieteellinen maailmankuva ja perustiedot ihmisyhteiskunnasta voisi silti olla vaatimuksena. Kysymyksessä olisi siis YO-kirjoitusten reaalikoe-tyyppinen tehtävistö. Tehtäviä voisi olla esim. 30kpl. Helpoimmat olisivat 10v ikäiselle koululaiselle sopivia ja vaikeimmat akateemisen peruskoulutuksen hankkineiden tasoa, vaikeutuen asteittain. Jokaiseen tehtävään kuuluisi laajahko tehtävänanto, asetelman kuvaus, jonka sekä ihmisen että botin olisi ymmärrettävä. Ymmärrystä ja taustatietoja pitäisi sitten osata soveltaa luovalla tavalla annetun tehtävän ratkaisemisessa.

Itse asiassa voisi olla kaksi sarjaa: toinen englannintaitoiselle botille ja toinen sellaiselle, joka osaa vain lojbania...