Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /***** Struktura programu wzorowana
- na implementacji algorytmu indukcji reguł
- W WERSJI DLA ZADANIA KLASYFIKACJI OBIEKTÓW
- OPISANYCH WARTOŚCIAMI ATRYBUTÓW według
- Bratko Prolog Programming for Artificial Intelligence
- ed. 3 Pearson Education / Addison-Wesley 2001
- *******************************************************************/
- /****Do testowych wykonań programu w ramach etapu 1
- -a więc przed skonstruowaniem procedury inicjalizującej learn-
- nalezy podać w wywołaniu procedury learn_rules :
- --jako przykłady pozytywne listę struktur o funktorze pos
- --jako przykłady negatywne listę struktur o funktorze neg
- --strukturę reprezentującą następnik właściwy dla predykatu,
- którego definicji ma uczyć się program w tym przebiegu
- --np. wuj(x,y), jeśli przedmiotem uczenia ma być predykat wuj
- --indeks wykorzystania zmiennych w następniku (w powyzszym przykładzie: 2).
- Nalezy tez pamiętać o wprowadzeniu do programu w postaci faktów:
- --bazy faktów operacyjnych - fakty known_fact
- --predykatów występujących w faktach bazy wiedzy - fakty predicate
- --listy symboli do wykorzystania jako zmienne - fakt variables
- *******************************************************************/
- variables([a,b,c,d,e]).
- % przyklady pozytywne dla predykatu babcia:
- known_fact(babcia(babcia_bogunia, jakub)).
- known_fact(babcia(babcia_regina, jakub)).
- known_fact(babcia(babcia_bogunia, monika)).
- known_fact(babcia(babcia_regina, monika)).
- known_fact(ojciec(dziadek_zbyszek, zbigniew)).
- known_fact(ojciec(dziadek_zygmunt, iwona)).
- known_fact(matka(babcia_bogunia, zbigniew)).
- known_fact(matka(babcia_regina, iwona)).
- known_fact(ojciec(zbigniew, jakub)).
- known_fact(matka(iwona, jakub)).
- known_fact(ojciec(zbigniew, monika)).
- known_fact(matka(iwona, monika)).
- predicate(matka, 2).
- predicate(ojciec, 2).
- predicate(babcia, 2).
- %% known_fact(parent(dziadek_zbyszek,ojciec)).
- %% known_fact(parent(babcia_bogunia,ojciec)).
- %% known_fact(parent(dziadek_zygmunt,mama)).
- %% known_fact(parent(babcia_regina,mama)).
- %% known_fact(parent(ojciec,jakub)).
- %% known_fact(parent(ojciec,monika)).
- %% known_fact(parent(mama,jakub)).
- %% known_fact(parent(mama,monika)).
- %% predicate(parent,2).
- learn_rules_wrapper(PosExamples, NegExamples, Conseq, VarsIndex, Limit, Rules):-
- learn_rules(PosExamples, NegExamples, Conseq, VarsIndex, Limit, Rules), !.
- learn_rules_wrapper(PosExamples, NegExamples, Conseq, VarsIndex, Limit, Rules):-
- NewLimit is Limit + 1,
- write('New limit is: '),
- write(NewLimit),
- write('\n'),
- NewLimit < 10,
- learn_rules_wrapper(PosExamples, NegExamples, Conseq, VarsIndex, NewLimit, Rules).
- learn_rules([ ] , _ , _ , _ , _ , [ ]).
- learn_rules(PosExamples, NegExamples, Conseq, VarsIndex, Limit, [Rule | RestRules]) :-
- learn_one_rule(PosExamples, NegExamples, rule(Conseq, [ ]), VarsIndex, Rule, Limit),
- remove(PosExamples, Rule, RestPosExamples),
- learn_rules(RestPosExamples, NegExamples, Conseq, VarsIndex, Limit, RestRules).
- learn_one_rule( _ , [ ] , Rule, _, Rule, _).
- learn_one_rule(PosExamples, NegExamples, PartialRule, LastUsed, Rule, Limit):-
- new_partial_rule(PosExamples, NegExamples, PartialRule, LastUsed, NewPartialRule, NewLastUsed),
- size_of_antecedent(NewPartialRule, Size),
- Limit >= Size,
- filter(PosExamples, NewPartialRule, PosExamples1),
- filter(NegExamples, NewPartialRule, NegExamples1),
- learn_one_rule(PosExamples1, NegExamples1, NewPartialRule, NewLastUsed, Rule, Limit).
- new_partial_rule(PosExamples, NegExamples, PartialRule, LastUsed, Rule, RetLastUsed) :-
- my_findall(NewRuleDescr,scored_rule(PosExamples, NegExamples, PartialRule, LastUsed, NewRuleDescr),Rules),
- bubblesort(Rules, SortedRules), !,
- get_elem_from_list(SortedRules, Rule, RetLastUsed, 0).
- %choose_best(SortedRules, Rule, RetLastUsed).
- scored_rule(PosExamples, NegExamples, PartialRule, LastUsed,rule_descr(CandPartialRule, Score, RetLastUsed) ) :-
- candidate_rule(PartialRule, PosExamples, NegExamples, LastUsed,CandPartialRule, RetLastUsed) ,
- filter(PosExamples, CandPartialRule, PosExamples1),
- filter(NegExamples, CandPartialRule, NegExamples1),
- length(PosExamples1, NPos),
- length(NegExamples1, NNeg),
- NPos > 0,
- Score is NPos - NNeg.
- candidate_rule(rule(Conseq, Anteced), _ , NegExamples, LastUsed, rule(Conseq, [Expr|Anteced]), RetLastUsed) :-
- build_expr(LastUsed, Expr, RetLastUsed),
- suitable(rule(Conseq, [Expr|Anteced]), NegExamples) .
- build_expr(LastUsed,Expr,RetLastUsed) :-
- predicate(Pred, N),
- build_arg_list(N, vars(LastUsed, LastUsed), false, ArgList, RetLastUsed),
- Expr =.. [Pred|ArgList] .
- build_arg_list(1, vars(LastUsed, LastLocal), true, [Arg], RetLastLocal) :-
- insert_arg(LastUsed, LastLocal,true, Arg, RetLastLocal, _).
- build_arg_list(1, vars(LastUsed, LastLocal), false, [Arg], LastLocal) :-
- insert_used(LastUsed, Arg).
- build_arg_list(N, vars(LastUsed, LastLocal), FlagIn, [Arg|RestArgs], RetLastLocal) :-
- N>1,
- insert_arg(LastUsed, LastLocal,FlagIn, Arg, NewLastLocal, FlagOut),
- N1 is N-1,
- build_arg_list(N1, vars(LastUsed, NewLastLocal), FlagOut, RestArgs, RetLastLocal).
- insert_arg(LastUsed, LastLocal, FlagIn, Arg, RetLastLocal, FlagOut) :-
- choose_var_index(LastUsed, LastLocal, FlagIn,Index,RetLastLocal, FlagOut),
- variables(Vars),
- take_var(Index, Vars, Arg).
- insert_used(LastUsed, Arg) :-
- generate_number(1, LastUsed, Index),
- variables(Vars),
- take_var(Index, Vars, Arg).
- take_var(1,[Var|_], Var).
- take_var(Index,[_|Rest], Arg) :-
- Index>1,
- Index1 is Index-1,
- take_var(Index1,Rest, Arg).
- choose_var_index(LastUsed, LastLocal,_,N,LastLocal, true) :-
- generate_number(1, LastUsed, N).
- choose_var_index(LastUsed, LastLocal, FlagIn,N,LastLocal, FlagIn) :-
- Min is LastUsed+1,
- generate_number(Min, LastLocal, N).
- choose_var_index(_, LastLocal,FlagIn,N,N,FlagIn) :-
- N is LastLocal+1.
- generate_number(Min,Max,Min):-
- Min=<Max.
- generate_number(Min,Max,N):-
- Min<Max,
- NewMin is Min+1,
- generate_number(NewMin,Max,N).
- filter(Examples, Rule, Examples1) :-
- findall(Example,(member1(Example, Examples), covers(Rule, Example)),Examples1).
- remove([ ],_ ,[ ]).
- remove([Example|Rest], Rule, Rest1) :-
- covers(Rule, Example), ! ,
- remove(Rest, Rule, Rest1).
- remove([Example|Rest], Rule, [Example|Rest1]) :-
- remove(Rest, Rule, Rest1).
- suitable(PartialRule, NegExamples) :-
- member1(NegEx, NegExamples),
- \+covers(PartialRule, NegEx), !.
- covers(rule(Conseq, Anteced), Example) :-
- match_conseq(Conseq, Example, Bindings),
- match_anteced(Anteced, Bindings, _ ) .
- match_conseq(Conseq, Example, BindingsOut) :-
- Conseq =.. [_|ArgList1],
- Example =.. [_|ArgList2],
- match_arg_lists(ArgList1,ArgList2,[],BindingsOut) .
- match_anteced([ ], Bindings, Bindings) .
- match_anteced([A|RestAnteced], BindingsIn, BindingsOut) :-
- match_expr(A, BindingsIn, Bindings1),
- match_anteced(RestAnteced, Bindings1, BindingsOut) .
- match_expr(Expr,BindingsIn,BindingsOut) :-
- known_fact(Fact),
- functor(Expr,Functor,N),
- functor(Fact,Functor,N),
- Expr =.. [_|ArgList1],
- Fact =.. [_|ArgList2],
- match_arg_lists(ArgList1,ArgList2,BindingsIn,BindingsOut) .
- match_arg_lists([ ] ,[ ], Bindings, Bindings) .
- match_arg_lists([Arg1|Rest1], [Arg2|Rest2], BindingsIn, BindingsOut) :-
- match_args(Arg1, Arg2, BindingsIn, Bindings1),
- match_arg_lists(Rest1, Rest2, Bindings1, BindingsOut) .
- match_args(Var,Val,[],[b(Var,Val)]).
- match_args(Var,Val,[b(Var,Val)|RestBindings],[b(Var,Val)|RestBindings]).
- match_args(Var,Val,[b(Var1,Val1)|RestBindings],[b(Var1,Val1)|RestBindings1]) :-
- Var\=Var1, Val\=Val1,
- match_args(Var,Val,RestBindings,RestBindings1).
- member1(X,[X|_]).
- member1(X,[_|R]):-
- member1(X,R).
- length1([ ], 0).
- length1([_|Rest], N) :-
- length1(Rest, NRest) ,
- N is NRest + 1 .
- /* generuj liste argumentow */
- gen_arg_lists(ListaWe, Size, Result):-
- bagof(OneArgList, gen_one_arg_list(ListaWe, Size, OneArgList), Result).
- gen_one_arg_list(_, 0, []).
- gen_one_arg_list(ListaWe, Size, [Elem | Rest]):-
- member1(Elem, ListaWe),
- Size > 0,
- NewSize is Size - 1,
- gen_one_arg_list(ListaWe, NewSize, Rest).
- /* koniec generuj liste argumentow */
- /* my findall */
- my_findall(X, Goal, Xlist) :-
- call(Goal), % Find a solution
- assertz(queue(X)), % Assert it
- fail; % Try to find another solution
- assertz(queue(bottom)), % Mark end of solutions
- collect(Xlist). % Collect found solutions
- collect(L) :-
- retract(queue(X)), !, % Retract next solution
- (X == bottom, !, L = [] % End of solutions?
- ;
- L = [X | Rest], collect(Rest)). % Otherwise collect the rest
- /* koniec my findall */
- /* sortowanie babelkowe listy regul czastkowych - score malejaco*/
- bubblesort(ListaWe, Wynik):-
- swap(ListaWe, NowaLista), !,
- bubblesort(NowaLista, Wynik).
- bubblesort(ListaWe, ListaWe).
- swap([rule_descr(Rule1, Score1, RetLastUsed1), rule_descr(Rule2, Score2, RetLastUsed2) | R], [rule_descr(Rule2, Score2, RetLastUsed2), rule_descr(Rule1, Score1, RetLastUsed1) | R]):-
- Score1 < Score2, !.
- swap([rule_descr(Rule1, Score1, RetLastUsed1), rule_descr(Rule2, Score2, RetLastUsed2) | R], [rule_descr(Rule1, Score1, RetLastUsed1) | RW]):-
- swap([rule_descr(Rule2, Score2, RetLastUsed2)|R], RW).
- /* Koniec sortowania */
- /* Niedeterministyczny wybor elementow z listy regul czastkowych*/
- get_elem_from_list([rule_descr(Rule, _, LastUsed)|_], Rule, LastUsed, Limit):-
- Limit < 2.
- get_elem_from_list([rule_descr(_,_,_)|Rest], Rule, LastUsed, Limit):-
- NewLimit is Limit +1,
- get_elem_from_list(Rest, Rule, LastUsed, NewLimit).
- /* Koniec */
- /* Zliczanie czlonów poprzednika */
- size_of_antecedent(rule(_, Antecedent), Size):-
- length1(Antecedent, Size).
- /* Koniec*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement