Iti0210lab7

Allikas: Lambda

Lausearvutuse solver ja teadmusbaas

Sissejuhatus

Teeme hästi lihtsa solveri, mis võimaldab teadmusbaasist järeldusi teha. Kasutame forward chaining algoritmi ([AIMA] 7.5.3-7.5.4). See algoritm eeldab, et teadmusbaas koosneb teatud kujul lausetest:

 a1 & a2 & ... & an -> b      (mingi reegel)
 a1 & ... & an -> false       (tõestatav lause, seda pole meil vaja)
 a2                           (mingi fakt)
 a3                           (mingi teine fakt)

Need on Horni normaalkujul laused. Tasub tähele panna, et seal ei ole ühtegi eitust! Seda forward chaining ei toeta.

Kui solver töötab, siis lahendame lihtsa tekstiülesande nii, et genereerime solverile söödavas formaadis teadmusbaasi ning rakendame solverit vastuste saamiseks.

Solver

Vaata slaididelt Pl-Fc-Entails algoritmi või õpikust Figure 7.15. Implementeeri see algoritm (näited on Pythonis, keele võid valida oma suva järgi).

 def fc_entails(kb, q):
    # kb - teadmusbaas mingil kujul
    # q - loogikamuutuja e. sümbol, mille kohta tahame teada, kas see järeldub kb-st
    

Loogikalausete teksti kujul parseerimist me siin ülesandes ei tee, esitame teadmusbaasi kohe mingi valmis andmestruktuurina.

Vajalikud sammud:

  1. mõtle välja, kuidas esitada teadmusbaasi. See peaks olema kogumik loogikalauseid;
  2. mõtle välja, mis kujul on loogikalause. Põhimõtteliselt koosneb see kahest osast, eeldused ja järeldus (õpikus ja slaididel vastavalt body ja head ning teisal premise ja conclusion). Faktide puhul on ainult järeldus. Üks sobiv formaat oleks sümbolite list, kus ühes otsas järeldus, näit. [ "a1", "a2", "b" ];
  3. funktsiooni alguses ehita abitabelid count, inferred ja initsialiseeri agenda. Lisaks oleks hea mõte teha neljas abitabel, kus iga sümboli kohta kirjas, mis lausete eelduseks ta on. See võimaldab algoritmil skaleeruda ka suurematele teadmusbaasidele;
  4. kirjuta algoritm ise, nii nagu slaididel või õpikus.

Solveri test

Pane need loogikalaused oma solverile sobivasse formaati:

 P -> Q
 L & M -> P
 B & L -> M
 A & P -> L
 A & B -> L
 A
 B

Tee kindlaks, et neist järeldub "Q". Kui A & B -> L reegel ära võtta, siis ei tohiks enam järelduda. Sama, kui eemaldada üks faktidest "A" või "B".

Tekstülesanne

Intelligentne robot soovib mängida "kivi-käärid-paber" mängu. Robotil on hüpotees, et inimesed mängivad kahte strateegiat kasutades: a.) kui inimene teeb kahes mängus sama valiku, siis ta teeb ka kolmandas mängus samamoodi (näit. eelmises ja üle-eelmises mängus kivi, siis ka järgmises mängus kivi ) ning b.) kui kahes eelmises mängus on olnud erinev valik, siis järgmises mängus ei kasutata kumbagi neist (näiteks kui eelmises mängus oli kivi ja üle-eelmises paber, siis on oodata et inimene valib käärid)

Tee teadmusbaas, mille järgi saab robot käiku valida. Idee peaks olema selles, et ennustada, mis on inimese järgmine valik kas strateegia a.) või b.) järgi ning roboti käik siis loomulikult selline, mis ennustatud valikut võidab.

Pane tähele, et ülesande tekstis on üldised reeglid, lausearvutusloogikas tuleb meil aga kasutada konkreetseid fakte. Inimese eelmine valik oli kivi - see on kas tõene või väär, jne. Seega kirjuta abiskript või funktsioon, mis programmiliselt genereeriks reeglid igasuguste kivi, käärid ja paber kombinatsioonide jaoks.

Teiseks kirjuta funktsioon, mis:

  1. võtab parameetriteks vastase kahe eelmise mängu valikud
  2. genereerib reeglibaasi ja lisab sinna faktidena valikud, mis parameetritena saadi
  3. küsib iga roboti valiku ("kivi", "käärid", "paber") kohta, kas see valik teadmusbaasist järeldub. Üks neist peaks järelduma ning see tuleb ka väljastada.

Näide:

 >>> kkp("Kivi", "Kivi")
 roboti käik: Paber
 >>> kkp("Paber", "Käärid")
 roboti käik: Paber