Professional Documents
Culture Documents
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
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 .
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;
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 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;
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
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;
10
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>.
11
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
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.
Duotas pradinis faktas A; Reikia gauti tiksl H (toks pats kaip ir antrajame io skyrelio pavyzdyje). Semantinis grafas:
14
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
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;
16
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
(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
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
20
vykdyta taisykl R3 Gaunamas faktas D Rasti visi taisykls R5 vykdyta taisykl R5 Gaunamas faktas H faktai: G
faktai: H
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.
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
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
28