You are on page 1of 28

VILNIAUS UNIVERSITETAS MATEMATIKOS IR INFORMATIKOS FAKULTETAS MATEMATINS INFORMATIKOS KATEDRA Renata Kananaviit Bioinformatikos studij programos IV kurso student

Tiesioginio ivedimo algoritm Forward-chaining ir Graph method palyginimas


Pagal Richard E. Neapolitan straipsnyje Forward-chaining versus a graph approach as the inference engine in expert systems pateiktus algoritmus.
2009-11-11

Turinys............................................................................................................................ 1 Turinys vadas............................................................................................................................. 2 1.Uduotis....................................................................................................................... 2 2.Tiesioginio ivedimo metod algoritmai......................................................................2 2.1Tiesioginio ivedimo metodas pagristas taisyklmis..............................................2 2.1.1Algoritmo pseudokodas.................................................................................... 2 2.2Tiesioginio ivedimo metodas pagristas faktais.....................................................5 2.2.1Algoritmo pseudokodas.................................................................................... 5 3.Program naudojimo pavyzdiai.................................................................................. 7 3.1Pavyzdiai i Richard E. Neapolitan straipsnyje Forward-chaining versus a graph approach as the inference engine in expert systems straipsnio (paprasti pavyzdiai) .................................................................................................................................... 7 3.2 Pavyzdys i dalyko Intelektualios sistemos paskait konspekto 18 skyriaus Tiesioginis ir atbulinis ivedimas produkcij sistemoje (paprastas pavyzdys).......10 3.3Paprasti pavyzdiai su skirtingu taisykli eilikumu ir tiksu.................................11 4.4 Pavyzdiai su vienodais taisykli rinkiniais, pradiniais faktais, bet skirtingais tikslais....................................................................................................................... 16 4.5 Pavyzdys, kai tikslo pasiekti nemanoma...........................................................20 4.Duomen fail formatai............................................................................................. 21 5.Program kodai......................................................................................................... 21 5.1.1Tiesioginio ivedimo metodo pagrsto taisyklmis programos kodas ............................................................................................................................... 21 1

5.1.2Tiesioginio ivedimo metodo pagrsto prielaidomis programos kodas...........25 6.Literatra................................................................................................................... 27

vadas
Tiesioginio ivedimo metodas (Forward-chaining), pagrstas modus ponens taisykle (i implikacijos ir jos antecedentui tapaios formuls gaunamas konsekventas) metodas, skirtas naujiems duomenims gauti, kai turimi pradiniai duomenys, bei taisykls, kurias taikant gaunama nauja informacija: tiesioginio ivedimo metu perbgant taisykli rinkin iekoma toki, kuri dka naudojant esamus duomenis generuojami nauji, kuriems esant kit taisykli dka generuojama tolesn informacija, kol pasiekiamas tikslas terminalin bsena.

1. Uduotis
Realizuoti du tiesioginio ivedimo metodus. Abiej metod pradinse slygose yra norodyti pradiniai duomenys faktai, tikslas, kur siekiama gauti bei taisykli rinkinys. Vieno metodo principas remiasi taisykli taikymu esamiems duomenims, kol gaunamas pageidaujamas rezultatas, o kito fakt i j srao perirjimas iki terminalins bsenos. i metod realizacija buvo paremta Richard E. Neapolitan

straipsnyje Forward-chaining versus a graph approach as the inference engine in expert systems pateiktais algoritmais. Tiesioginio ivedimo metodai buvo realizuoti C++ programavimo kalba.

2. Tiesioginio ivedimo metod algoritmai 2.1 Tiesioginio ivedimo metodas pagristas taisyklmis
2.1.1 Algoritmo pseudokodas
I duomen failo nuskaitomos taisykls: Sukuriamas fakt sraas, kur patalpinamos pradiniai, klaviatra vesti faktai; Klaviatra vedamas tikslas; Sukuriamas tuias panaudot taisykli sraas; Sukuriamas taisykli masyvas; 2

Sukuriama taisykli masyvo kopija pradini taisykli sraas; KOL TAISYKLI SRAO ILGIS DIDESNIS NEI NULIS{ Taisykls numeris = 0; PEREITI PER TAISYKLI MASYV{ PATIKRINTI, ar yra reikimi taisyklei faktai{ Jei TAIP itrinti taisykl i pradini taisykli srao, jei ji ten yra; PATIKRINTI, ar taisykls ivada yra fakt srae Jei taisykls ivados nra srae{ Padidinamas fakt sraas; fakt srao gal dedama taisykls ivada; Jei faktas lygus terminalinei bsenai, taisykli srao ilgis prilyginamas nuliui Taisykl dedama panaudot taisykli sra Pereinama prie kitos taisyks } Jei NE - pereinama prie kitos taisyks } Jei NE - pereinama prie kitos taisyks } } Rezultato ivedimas ekran .

2.2 Tiesioginio ivedimo metodas pagristas faktais


2.2.1 Algoritmo pseudokodas
I duomen failo nuskaitomos taisykles Sukuriamas dinaminis fakt sraas; fakt sra patalpinamos pradiniai klaviatra vesti faktai Sukuriamas tuias grafo mazg masyvas; KARTOJAMA KOL NEPERBGAMA PER VISUS FAKTUS MASYVE{ PEREITI PER VISAS TAISYKLES, NAUDOJANIAS FAKT{ PATIKRINTI, ar grafo mazgas reikalauja tiriamo fakto: Jei TAIP: Pridedamas vienetas prie mazgo skaitiklio; PATIKRINTI, ar skaitliuko reikm ir reikiamo taisyklei fakt skaiiaus reikms sutampa: Jei TAIP:{ fakt sra keliamas taisykls generuojamas faktas; Jei sugeneruotas taisykls faktas sutampa su tikslu baigti darb. } } Rezultato ivedimas ekran.

3. Program naudojimo pavyzdiai


Tiesioginio ivedimo taisykli metod (sutrumpintai FC) realizuoja programa FC.cpp, o fakt metod(sutrumpintai GM) GM_1.cpp. iame skyrelyje yra pademonstruoti ir palyginti i program vykdymo rezultatai.

3.1 Pavyzdiai i Richard E. Neapolitan straipsnyje Forward-chaining versus a graph approach as the inference engine in expert systems straipsnio (paprasti pavyzdiai)
1) Pirmame straipsnyje naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_1.txt):
Taisykls: R1 3 A,B,C -> D; R2 1 D -> E; R3 2 E,F -> G;

Duoti pradiniai faktai: A, B, C, F. Reikia gauti tiksl G. Semantinis grafas:

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)

Tiesioginis ivedimas pagrstas fakt metodu (programa GM_1.cpp)

veskite failo pavadinima: data_1.txt Iveskite duot fakt skaii: 4 veskite 4 pradinius faktus: ABCF Iveskite norim gauti tiksl: G Taisykles: R1 : A B C -> D R2 : D -> E R3 : E F -> G Pradiniai faktai: A B C F Tikslas: G

veskite failo pavadinim: data_1.txt Iveskite duot fakt skaii: 4 veskite 4 pradinius faktus: ABCF Iveskite norim gauti tiksl: G Taisykles: R1 : A B C -> D R2 : D -> E R3 : E F -> G Pradiniai faktai: A B C F Tikslas: G Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. Prie taisykls R1 skaitliuko naudojant fakt B pridtas vienetas. Prie taisykls R1 skaitliuko naudojant fakt C pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas D. Prie taisykls R3 skaitliuko naudojant fakt F pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt D pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas E. Prie taisykls R3 skaitliuko naudojant fakt E pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas G. Tikslas G pasiektas

Rasti visi taisykls R1 faktai:A B C vykdyta taisykl R1 Gaunamas faktas D

Rasti visi taisykls R2 faktai: D vykdyta taisykl R2 Gaunamas faktas E Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas G Tikslas G pasiektas faktai: E F

Tiek FM tiek GM metodu gaunama ta pati produkcij sistema: <R1, R2, R3>. 2) Antrame straipsnyje naudojamo pavyzdio taisykls nurodytos tokios (duomen
failas data_2.txt):
Taisykls: R1 2 A,B -> C; R2 3 D,E,F -> A; R3 1 G -> B;

Duoti pradiniai faktai: D, E, G, F. Reikia gauti tiksl C. Semantinis grafas:

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_2.txt Iveskite duot fakt skaii: 4 veskite 4 pradinius faktus: DEGF Iveskite norim gauti tiksl: C Taisykles: R1 : A B -> C R2 : D E F -> A R3 : G -> B Pradiniai faktai: D E G F Tikslas: C

Tiesioginis ivedimas pagrstas fakt metodu (programa GM_1.cpp)


veskite failo pavadinim: data_2.txt Iveskite duot fakt skaii: 4 veskite 4 pradinius faktus: DEGF Iveskite norim gauti tiksl: C Taisykles: R1 : A B -> C R2 : D E F -> A R3 : G -> B Pradiniai faktai: D E G F Tikslas: C Prie taisykls R2 skaitliuko naudojant fakt D pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt E pridtas vienetas. Prie taisykls R3 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas B. Prie taisykls R2 skaitliuko naudojant fakt F pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas A. Prie taisykls R1 skaitliuko naudojant fakt B pridtas vienetas. Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas C. Tikslas C pasiektas

Rasti visi taisykls R2 faktai:D E F vykdyta taisykl R2 Gaunamas faktas A Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas B faktai: G

Rasti visi taisykls R1 vykdyta taisykl R1 Gaunamas faktas C Tikslas C pasiektas

faktai: A B

FM metodu gauta produkcij sistema gauta yra tokios: <R2, R3, R1>, o GM metodu - <R3, R2, R1>. Matome kad metodai pateikia produkcij sistemas su skirtingai isidesiusiomis taisyklmis.

3.2 Pavyzdys i dalyko Intelektualios sistemos paskait konspekto 18 skyriaus Tiesioginis ir atbulinis ivedimas produkcij sistemoje (paprastas pavyzdys)
Naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_3.txt):
Taisykls: R1 2 F,B -> Z; R2 2 C,D -> F; R3 1 A -> D;

Duoti pradiniai faktai: A, B, C. Reikia gauti tiksl Z. Semantinis grafas:

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_3.txt Iveskite duot fakt skaii: 3 veskite 3 pradinius faktus: ABC Iveskite norim gauti tiksl: Z Taisykles: R1 : F B -> Z R2 : C D -> F R3 : A -> D Pradiniai faktai: A B C Tikslas: Z

Tiesioginis ivedimas pagrstas grafo metodu (programa GM_1.cpp)


veskite failo pavadinim: data_3.txt Iveskite duot fakt skaii: 3 veskite 3 pradinius faktus: ABC Iveskite norim gauti tiksl: Z Taisykles: R1 : F B -> Z R2 : C D -> F R3 : A -> D Pradiniai faktai: A B C Tikslas: Z Prie taisykls R3 skaitliuko naudojant fakt A

10

Rasti visi taisykls R3 faktai: A vykdyta taisykl R3 Gaunamas faktas D

Rasti visi taisykls R2 faktai: C D vykdyta taisykl R2 Gaunamas faktas F Rasti visi taisykls R1 faktai: F B vykdyta taisykl R1 Gaunamas faktas Z Tikslas Z pasiektas

pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas D. Prie taisykls R1 skaitliuko naudojant fakt B pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt C pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt D pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas F. Prie taisykls R1 skaitliuko naudojant fakt F pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas Z. Tikslas Z pasiektas

Tiek FM tiek GM metodu gaunama ta pati produkcij sistema: <R3, R2, R1>.

3.3 Paprasti pavyzdiai su skirtingu taisykli eilikumu ir tiksu


1) Naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_4.txt):
Taisykls: R1 1 A R2 1 B R3 1 B R4 1 B R5 1 E R6 1 A R7 1 G -> -> -> -> -> -> -> B; C; D; E; F; G; H;

Duotas pradinis faktas A; Reikia gauti tiksl G. Semantinis grafas:

11

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_8.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: G Taisykles: R1 : A -> B R2 : B -> C R3 : B -> D R4 : B -> E R5 : E -> F R6 : A -> G R7 : G -> H Pradiniai faktai: A Tikslas: G Rasti visi taisykls R1 vykdyta taisykl R1 Gaunamas faktas B Rasti visi taisykls R2 vykdyta taisykl R2 Gaunamas faktas C faktai: A

Tiesioginis ivedimas pagrstas fakt metodu (programa GM_1.cpp)


veskite failo pavadinim: data_8.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: G Taisykles: R1 : A -> B R2 : B -> C R3 : B -> D R4 : B -> E R5 : E -> F R6 : A -> G R7 : G -> H Pradiniai faktai: A Tikslas: G Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas B. Prie taisykls R6 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R6 Prie faktu saraso pridetas faktas G.

faktai: B

12

Tikslas G pasiektas Rasti visi taisykls vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls vykdyta taisykl R4 Gaunamas faktas E Rasti visi taisykls vykdyta taisykl R5 Gaunamas faktas F Rasti visi taisykls vykdyta taisykl R6 Gaunamas faktas G Tikslas G pasiektas R3 R4 R5 R6 faktai: B faktai: B faktai: E faktai: A

Metodu FM gauta produkcij sistema yra <R1 ,R2, R3, R4, R5, R6>, o GM metodu <R1, R6>. Akivaizdu, kad esant tokiai taisykli sistemai, norimas tikslas greiiau pasiekiamas naudojant GM metod. 2) Naudojamas toks pats taisykli rinkinys, kaip ir io skyrelio pirmjame variante, todl ir semantinis grafas nepakits (duomen failas data_4.txt):

Reikia gauti tiksl H. Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)
veskite failo pavadinima: data_8.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: H Taisykles: R1 : A -> B R2 : B -> C R3 : B -> D R4 : B -> E R5 : E -> F R6 : A -> G R7 : G -> H Pradiniai faktai: A Tikslas: H Rasti visi taisykls R1 vykdyta taisykl R1 Gaunamas faktas B faktai: A

Tiesioginis ivedimas pagrstas fakt metodu (programa GM_1.cpp)


veskite failo pavadinim: data_8.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: H Taisykles: R1 : A -> B R2 : B -> C R3 : B -> D R4 : B -> E R5 : E -> F R6 : A -> G R7 : G -> H Pradiniai faktai: A Tikslas: H Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas B. Prie taisykls R6 skaitliuko naudojant fakt A

13

Rasti visi taisykls R2 vykdyta taisykl R2 Gaunamas faktas C Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls R4 vykdyta taisykl R4 Gaunamas faktas E Rasti visi taisykls R5 vykdyta taisykl R5 Gaunamas faktas F Rasti visi taisykls R6 vykdyta taisykl R6 Gaunamas faktas G Rasti visi taisykls R7 vykdyta taisykl R7 Gaunamas faktas H Tikslas H pasiektas

faktai: B

faktai: B

faktai: B

faktai: E

faktai: A

faktai: G

pridtas vienetas. vykdyta taisykl R6 Prie faktu saraso pridetas faktas G. Prie taisykls R2 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas C. Prie taisykls R3 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas D. Prie taisykls R4 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R4 Prie faktu saraso pridetas faktas E. Prie taisykls R7 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R7 Prie faktu saraso pridetas faktas H. Tikslas H pasiektas

Naudojant FM metod gauname produkcij sistem <R1, R2, R3, R4, R5, R6, R7>, o GM metodu - <R1, R6, R2, R3, R4, R7>. Matome, vykdius abu metodus gaunamos skirtingos produkcij sistemos, o GM metodu iekant tikslo, tikslas pasiektas greiiau.

3) Naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_5.txt):


Taisykls: R1 1 A R2 1 A R3 1 G R4 1 B R5 1 B R6 1 B R7 1 E -> -> -> -> -> -> -> B; G; H; D; E; C; F;

Duotas pradinis faktas A; Reikia gauti tiksl H (toks pats kaip ir antrajame io skyrelio pavyzdyje). Semantinis grafas:
14

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_9.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: H Taisykles: R1 : A -> B R2 : A -> G R3 : G -> H R4 : B -> D R5 : B -> E R6 : B -> C R7 : E -> F Pradiniai faktai: A Tikslas: H

Tiesioginis ivedimas pagrstas fakto metodu (programa GM_1.cpp)


veskite failo pavadinim: data_9.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: H Taisykles: R1 : A -> B R2 : A -> G R3 : G -> H R4 : B -> D R5 : B -> E R6 : B -> C R7 : E -> F Pradiniai faktai: A Tikslas: H

Rasti visi taisykls R1 vykdyta taisykl R1 Gaunamas faktas B Rasti visi taisykls R2 vykdyta taisykl R2 Gaunamas faktas G

faktai: A

faktai: A

Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas B. Prie taisykls R2 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas G. Prie taisykls R4 skaitliuko naudojant fakt B

15

Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas H Tikslas H pasiektas

faktai: G

pridtas vienetas. vykdyta taisykl R4 Prie faktu saraso pridetas faktas D. Prie taisykls R5 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R5 Prie faktu saraso pridetas faktas E. Prie taisykls R6 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R6 Prie faktu saraso pridetas faktas C. Prie taisykls R3 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas H. Tikslas H pasiektas Ar norite tsti darb?

FM metodu gauta produkcij sistema <R1, R2, R3>, o GM metodu - <R1, R2, R4, R5, R5, R3>. Esant tokiam taisykli isidstymui, tikslas pasiektas greiiau vykdant FM metod.

4.4 Pavyzdiai su vienodais taisykli rinkiniais, pradiniais faktais, bet skirtingais tikslais
1) Naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_6.txt):
Taisykls: R1 1 A R2 1 B R3 1 C R4 1 D R5 1 H R6 2 A,K R7 1 G R8 1 E R9 2 G R101 B -> -> -> -> -> -> -> -> -> -> B; C; D; H; I; G; E; F; J; K;

Duota pradin prielaida A; Reikia gauti tiksl I. Semantinis grafas:

16

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_5.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: J Taisykles: R1 : A -> B R2 : B -> C R3 : C -> D R4 : D -> H R5 : H -> I R6 : A K -> G R7 : G -> E R8 : E -> F R9 : G -> J R10: B -> K Pradiniai faktai: A Tikslas: J Rasti visi taisykls R1 vykdyta taisykl R1 faktai: A

Tiesioginis ivedimas pagrstas grafo metodu (programa GM_1.cpp)


veskite failo pavadinim: data_5.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: J Taisykles: R1 : A -> B R2 : B -> C R3 : C -> D R4 : D -> H R5 : H -> I R6 : A K -> G R7 : G -> E R8 : E -> F R9 : G -> J R10: B -> K Pradiniai faktai: A Tikslas: J Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1

17

Gaunamas faktas B

Rasti visi taisykls R2 vykdyta taisykl R2 Gaunamas faktas C Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls R4 vykdyta taisykl R4 Gaunamas faktas H Rasti visi taisykls R5 vykdyta taisykl R5 Gaunamas faktas I

faktai: B

faktai: C

faktai: D

faktai: H

Rasti visi taisykls R10 faktai: B vykdyta taisykl R10 Gaunamas faktas K Rasti visi taisykls R6 faktai:A K vykdyta taisykl R6 Gaunamas faktas G Rasti visi taisykls R7 vykdyta taisykl R7 Gaunamas faktas E Rasti visi taisykls R8 vykdyta taisykl R8 Gaunamas faktas F Rasti visi taisykls R9 vykdyta taisykl R9 Gaunamas faktas J Tikslas J pasiektas faktai: G

faktai: E

Prie faktu saraso pridetas faktas B. Prie taisykls R6 skaitliuko naudojant fakt A pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas C. Prie taisykls R10 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R10 Prie faktu saraso pridetas faktas K. Prie taisykls R3 skaitliuko naudojant fakt C pridtas vienetas. vykdyta taisykl R3 Prie faktu saraso pridetas faktas D. Prie taisykls R6 skaitliuko naudojant fakt K pridtas vienetas. vykdyta taisykl R6 Prie faktu saraso pridetas faktas G. Prie taisykls R4 skaitliuko naudojant fakt D pridtas vienetas. vykdyta taisykl R4 Prie faktu saraso pridetas faktas H. Prie taisykls R7 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R7 Prie faktu saraso pridetas faktas E. Prie taisykls R9 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R9 Prie faktu saraso pridetas faktas J. Tikslas J pasiektas

faktai: G

FM metodu gauta produkcij sistema <R2, R3, R4, R5, R10, R6, R7, R8, R9>, o GM metodu - <R1, R2, R10, R3, R6, R4, R6, R4, R7, R9>. Matome, Kad FM metodu tikslas bus apsiektas su maesniu taisykli rinkiniu, taiau liau nei GM metodu, nes FM programa kelet kart perbgins per taisykli sra.

2) Naudojamo pavyzdio taisykls tokios pat, kaip ir 4.4 skyrelio 1-oje dalyje (duomen failas data_6.txt): Duotas pradinis faktas A; Reikia pasiekti tiksl K. Tiesioginis ivedimas pagrstas grafo metodu
18

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_5.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: K Taisykles: R1 : A -> B R2 : B -> C R3 : C -> D R4 : D -> H R5 : H -> I R6 : A K -> G R7 : G -> E R8 : E -> F R9 : G -> J R10: B -> K Pradiniai faktai: A Tikslas: K Rasti visi taisykls R1 vykdyta taisykl R1 Gaunamas faktas B faktai: A

(programa GM_1.cpp)

veskite failo pavadinim: data_5.txt Iveskite duot fakt skaii: 1 veskite 1 pradin fakt: A Iveskite norim gauti tiksl: K Taisykles: R1 : A -> B R2 : B -> C R3 : C -> D R4 : D -> H R5 : H -> I R6 : A K -> G R7 : G -> E R8 : E -> F R9 : G -> J R10: B -> K Pradiniai faktai: A Tikslas: K Prie taisykls R1 skaitliuko naudojant fakt A pridtas vienetas. vykdyta taisykl R1 Prie faktu saraso pridetas faktas B. Prie taisykls R6 skaitliuko naudojant fakt A pridtas vienetas. Prie taisykls R2 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R2 Prie faktu saraso pridetas faktas C. Prie taisykls R10 skaitliuko naudojant fakt B pridtas vienetas. vykdyta taisykl R10 Prie faktu saraso pridetas faktas K. Tikslas K pasiektas Ar norite tsti darb? Jei taip, veskite T, jei ne - N:

Rasti visi taisykls R2 vykdyta taisykl R2 Gaunamas faktas C Rasti visi taisykls R3 vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls R4 vykdyta taisykl R4 Gaunamas faktas H Rasti visi taisykls R5 vykdyta taisykl R5 Gaunamas faktas I Rasti visi taisykls R10 vykdyta taisykl R10 Gaunamas faktas K Tikslas K pasiektas

faktai: B

faktai: C faktai: D faktai: H faktai: B

FM metodu gaunama produkcij sistema < R1, R2, R3, R4, R5, R10 >, oGM metodu - < R1, R2, R10>. GM metodu kslas yra pasiektas naudojant maiau taisykli.

19

4.5 Pavyzdys, kai tikslo pasiekti nemanoma.


Naudojamo pavyzdio taisykls nurodytos tokios (duomen failas data_7.txt):
Taisykls: R1 2 F,B R2 2 C,D R3 1 A R4 1 H R5 1 G -> -> -> -> -> Z; F; D; B; H;

Duoti pradiniai faktai: A, G. Reikia gauti tiksl Z. Semantinis grafas:

Tiesioginis ivedimas pagrstas taisykli metodu (programa FC.cpp)


veskite failo pavadinima: data_6.txt Iveskite duot fakt skaii: 2 veskite 2 pradinius faktus: AG Iveskite norim gauti tiksl: Z Taisykles: R1 : F B -> Z R2 : C D -> F R3 : A -> D R4 : H -> B R5 : G -> H Pradiniai faktai: A G Tikslas: Z Rasti visi taisykls R3 faktai: A

Tiesioginis ivedimas pagrstas fakt metodu (programa GM_1.cpp)


veskite failo pavadinim: data_6.txt Iveskite duot fakt skaii: 2 veskite 2 pradinius faktus: AG Iveskite norim gauti tiksl: Z Taisykles: R1 : F B -> Z R2 : C D -> F R3 : A -> D R4 : H -> B R5 : G -> H Pradiniai faktai: A G Tikslas: Z Prie taisykls R3 skaitliuko pridtas vienetas. naudojant fakt A

20

vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls R5 vykdyta taisykl R5 Gaunamas faktas H faktai: G

Rasti visi taisykls R4 vykdyta taisykl R4 Gaunamas faktas B

faktai: H

Pageidaujamas rezultatas nepasiektas

vykdyta taisykl R3 Prie faktu saraso pridetas faktas D. Prie taisykls R5 skaitliuko naudojant fakt G pridtas vienetas. vykdyta taisykl R5 Prie faktu saraso pridetas faktas H. Prie taisykls R2 skaitliuko naudojant fakt D pridtas vienetas. Prie taisykls R4 skaitliuko naudojant fakt H pridtas vienetas. vykdyta taisykl R4 Prie faktu saraso pridetas faktas B. Prie taisykls R1 skaitliuko naudojant fakt B pridtas vienetas. Norimo tikslo nepavyko gauti.

Tiek FM, tiek GM metodais gauta ivada, kad tikslo pasiekt nemanoma.

4. Duomen fail formatai


Duomen failai yra sudaromi tokio formato: 1) Pirmoji eilut informacin; 2) Nuo antrosios eiluts prasideda taisykli apraymai: a) Pirmuose trijuose eiluts simboliuose nurodytas taisykls vardas; b) Ketvirtas simbolis fakt skaiius; c) etas, atuntas bei deimtas simboliai faktai (taisykl duotuoju atveju gali turti nedaugiau nei 3 faktus). ie simboliai atskirti kableliais; d) Penkioliktas simbolis taisykls taikymo ivada. Duomen failo pavyzdys : Taisykls: R1 3 A,B,C -> D; R3 2 E,F -> G; R2 1 D -> E;

5. Program kodai
5.1.1 Tiesioginio ivedimo metodo pagrsto taisyklmis programos kodas
Programos kodas saugomas faile pavadintame FC.cpp.
#include <iostream> #include <fstream> #include <cstring> using namespace std;

21

struct taisykles{ string vardas; int sk; char prod[5]; char rezult[1]; }; char * didink(char *, int &); bool tikrink(char [], int, char*, int); string * trink(string *, int &, string); const int N = 25; int main(){ int nr = 0, nr1 = 0, nr_1, n = 0, n1 = 0, j; char buf[25], ivesti_faktai[5], tikslas, failas[20]; char pav_buf[3]; taisykles rinkinys[100]; string * panaud; string * esamos; char * prod = new char[0]; cout << "veskite failo pavadinima: \n"; cin>>failas; ifstream dataf(failas); dataf.getline(buf, N); while(dataf.getline(buf, N)){ for (j = 0; j<3; j++){ pav_buf[j] = buf[j]; } string tmp(pav_buf); tmp.resize(3); rinkinys[nr].vardas = tmp; rinkinys[nr].sk = buf[3]- 48; for (int k= 0; k<rinkinys[nr].sk; k++){ rinkinys[nr].prod[k] = buf[5+k*2]; } rinkinys[nr].rezult[0] = buf[14]; nr++; } n1 = nr; esamos = new string[n1]; panaud = new string[nr]; for (j= 0; j<nr; j++){ esamos[j] = rinkinys[j].vardas; } nr_1 = nr; bool ar_yra_p; bool ar_yra_r; int vienas = 1; int num = 0, kelintas = 0; string trynimui; int w; cout << "Iveskite duot fakt skaii: \n"; cin >> nr1; if (nr1 == 1) cout << "veskite "<< nr1 << " pradin fakt: \n"; else cout << "veskite "<< nr1 << " pradinius faktus: \n"; cin >> ivesti_faktai; for(j = 0; j<nr1; j++){ prod = didink(prod, n); prod[j] = ivesti_faktai[j];

22

} cout << "Iveskite norim gauti tiksl: \n"; cin >> tikslas; cout << endl; cout<<"Taisykles: \n"; for(int f = 0; f<nr; f++){ cout << rinkinys[f].vardas << ": "; for(int z = 0; z<rinkinys[f].sk; z++) cout << rinkinys[f].prod[z]<< " "; cout << " -> "<< rinkinys[f].rezult[0]<< endl; } cout << "Pradiniai faktai: \n"; for(int f = 0; f<nr1; f++) cout << prod[f]<< " "; cout << endl; cout <<"Tikslas: \n"; cout << tikslas<< endl; while(n1 > 0){ w = n1; num = 0; for(int i = 0; i< nr; i++){ ar_yra_p = tikrink(rinkinys[num].prod,rinkinys[num].sk, prod, n); if(ar_yra_p){ for(int s = 0; s< n1; s++){ if (esamos[s] == rinkinys[num].vardas){ trynimui = rinkinys[num].vardas; esamos = trink(esamos, n1, trynimui); } } ar_yra_r = tikrink(rinkinys[num].rezult, vienas, prod, n); if (!ar_yra_r){ cout << "Rasti visi taisykls "<< rinkinys[num].vardas<< " faktai: "; for(int b = 0; b< rinkinys[num].sk; b++) cout << rinkinys[num].prod[b]<< " "; cout << endl; cout << "vykdyta taisykl "<< rinkinys[num].vardas <<endl; cout << "Gaunamas faktas "<< rinkinys[num].rezult[0]<< endl; prod = didink(prod, n); prod[n-1] = rinkinys[num].rezult[0]; if (prod[n-1] == tikslas){ n1 = 0; break; } panaud[kelintas] = rinkinys[num].vardas; kelintas++; num++; } else num++; } else num++; } if (w == n1) n1 = 0; } ar_yra_r = false; bool ar_rado = false; for(int b = 0; b< n; b++){ if (prod[b] == tikslas)

23

ar_rado = true; } cout << endl; } if(!ar_rado) cout << "Pageidaujamas rezultatas - nepasiektas"; else cout << "Tikslas "<< tikslas << " pasiektas"; return 0; } char * didink(char * senas, int &n){ int m = n; n++; char *temp; if(temp = new char[n]) for (int i = 0; i<m; i++) temp[i] = senas[i]; delete [] senas; return temp; } string * trink(string * senas, int &n, string vard){ string * tmp = new string[n]; int j=0; for(int i = 0; i<n; i++) if (senas[i] != vard){ tmp[j] = senas[i]; j++; } n--; delete [] senas; return tmp; } bool tikrink(char pr[], int skc, char* esan, int m){ bool taip = false; bool rez[skc]; int j; for(j = 0; j<skc; j++){ rez[j] = false; for (int g = 0; g<m; g++){ if (pr[j] == esan[g]){ rez[j] = true; } } } bool tp = true; for(j = 0; j<skc; j++) if(tp && rez[j]) tp = true; else{ tp = false; } taip = tp; return taip; }

24

5.1.2 Tiesioginio ivedimo metodo pagrsto prielaidomis programos kodas


Programos kodas saugomas faile pavadintame GM.cpp.
#include <iostream> #include <fstream> #include <cstring> using namespace std; struct mazgas{ int skaitliukas; int sk ; char rezultatas; char faktai[5]; string vardas; }; mazgas * didink(mazgas * senas, int &); char * didink_c(char * senas, int &); bool Ar_visos_saraso_reiksmes(int , int); bool Ar_naudoja_fakta(mazgas, char); bool Ar_yra_faktas(char[], char, int); char * isvalyti(char *, int &); const int N = 30; int main(){ char failas[20], buf[N]; int fakt_sk = 0, nr = 0, j, nr1 = 0, num; char tikslas, ivesti_faktai[5], pav_buf[4], atsak[1], *prad_faktai = new char[nr1]; bool baigti = true; string tmp; mazgas *rinkinys = new mazgas[nr]; cout << "veskite failo pavadinim: \n"; cin>>failas; ifstream dataf(failas); dataf.getline(buf, N); while(dataf.getline(buf, N)){ rinkinys = didink(rinkinys, nr); for (j = 0; j<3; j++){ pav_buf[j] = buf[j]; } string tmp(pav_buf); tmp.resize(3); rinkinys[nr-1].vardas = tmp; rinkinys[nr-1].sk = buf[3] - 48; for (j= 0; j<rinkinys[nr-1].sk; j++){ rinkinys[nr-1].faktai[j] = buf[5+j*2]; } rinkinys[nr-1].rezultatas = buf[14]; rinkinys[nr-1].skaitliukas = 0; } while(baigti){ prad_faktai = isvalyti(prad_faktai, nr1); cout << "Iveskite duot fakt skaii: \n"; cin >> fakt_sk; if (fakt_sk == 1) cout << "veskite "<< fakt_sk << " pradin fakt: \n"; else cout << "veskite "<< fakt_sk << " pradinius faktus: \n";

25

cin >> ivesti_faktai; for(j = 0; j<fakt_sk; j++){ prad_faktai = didink_c(prad_faktai, nr1); prad_faktai[nr1-1] = ivesti_faktai[j]; } cout << "Iveskite norim gauti tiksl: \n"; cin>> tikslas; cout << endl; num = 0; cout << "Taisykles: \n"; for (int f = 0; f<nr; f++){ cout << rinkinys[f].vardas << ": "; for(int k = 0; k<rinkinys[f].sk; k++) cout << rinkinys[f].faktai[k]<< " "; cout << " -> "<< rinkinys[f].rezultatas << endl; } cout << "Pradiniai faktai:"<< endl; for (int f = 0; f<fakt_sk; f++) cout << prad_faktai[f]<< " "; cout << endl; cout << "Tikslas: \n"; cout << tikslas<< endl; cout << endl; for(int k = 0; k<nr; k++) rinkinys[k].skaitliukas = 0; bool viskas = true; while((Ar_visos_saraso_reiksmes(nr1, num))&&(viskas)){ for(j = 0; j<nr; j++){ if(Ar_naudoja_fakta(rinkinys[j], prad_faktai[num])){ cout << "Prie taisykls "<<rinkinys[j].vardas << " skaitliuko " << " naudojant fakt " << prad_faktai[num]<<" pridtas vienetas.\n"; rinkinys[j].skaitliukas ++; if ((rinkinys[j].skaitliukas == rinkinys[j].sk) &&(! Ar_yra_faktas(prad_faktai, rinkinys[j].rezultatas, nr1))){ prad_faktai = didink_c(prad_faktai, nr1); prad_faktai[nr1-1] = rinkinys[j].rezultatas; cout << "\tvykdyta taisykl "<< rinkinys[j].vardas<< endl; cout << "\tPrie faktu saraso pridetas faktas "<< prad_faktai[nr1-1]<<". \n"; if (prad_faktai[nr1-1] == tikslas){ viskas = false; cout << "Tikslas "<< tikslas << " pasiektas\n"; break; } } } } num++; } if (viskas) cout << "Norimo tikslo nepavyko gauti.\n"; cout << "Ar norite tsti darb?\n"; cout << "Jei taip, veskite T, jei ne - N: \n"; cin >> atsak; if(atsak[0] == 'N') baigti = false; } return 0; }

26

mazgas * didink(mazgas * senas, int &n){ int m = n; n++; mazgas *temp; if(temp = new mazgas[n]) for (int i = 0; i<m; i++) temp[i] = senas[i]; delete [] senas; return temp; } char * didink_c(char * senas, int &n){ int m = n; n++; char *temp; if(temp = new char[n]) for (int i = 0; i<m; i++) temp[i] = senas[i]; delete [] senas; return temp; } bool Ar_visos_saraso_reiksmes(int n, int m){ bool taip = false; if (n>m) return taip = true; return taip; } bool Ar_naudoja_fakta(mazgas mazg, char fakt){ bool taip = false; int i; for(i = 0; i<mazg.sk; i++) if(mazg.faktai[i] == fakt) return taip = true; return taip; } bool Ar_yra_faktas(char mas[], char a, int n){ bool taip = false; for(int i = 0; i<n; i++) if (mas[i] == a) return taip; return taip; } char * isvalyti(char *senas, int &n){ n = 0; char *temp; temp = new char[n]; delete [] senas; return temp; }

6. Literatra
1. Richard E. Neapolitan, Forward-chaining versus a graph approach as the inference engine in expert systems, 1986
27

2. Vytautas yras, Intelektualios sistemos: Paskait konspektas, 2009 3. Wikipedia, http://en.wikipedia.org/wiki/Forward_chaining

28

You might also like