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
- *******************************************************************/
- % 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)).
- %fakty operacyjne
- 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)).
- /***********************************************************************/
- /*% przyklady pozytywne dla predykatu wuj
- known_fact(wuj(jacek, jakub)).
- known_fact(wuj(jacek, monika)).
- known_fact(wuj(jacek, mateusz)).
- % fakty operacyjne
- known_fact(ojciec(zbigniew, jakub)).
- known_fact(ojciec(zbigniew, monika)).
- known_fact(ojciec(zbigniew, mateusz)).
- known_fact(brat(zbigniew, jacek)).*/
- /***********************************************************************/
- 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),
- length1(Vars, Len),
- Index > Len,
- write('Input next variable: '),
- write('\n'),
- read(Var),
- append(Vars, Var, NewVars),
- retract(variables(_)),
- assertz(variables(NewVars)),
- take_var(Index, NewVars, Arg).
- 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.
- append([], X, [X]).
- append([Y|List], X, [Y|Result]):-
- append(List, X, Result).
- /* learn */
- learn(Rules):-
- retractall(variables(_)),
- retractall(predicate(_,_)),
- assertz(variables([a,b])),
- assertz(predicate(ojciec, 2)),
- assertz(predicate(babcia, 2)),
- assertz(predicate(matka, 2)),
- read(PredName),
- predicate(PredName, Arity),
- collect_neg_examples(PredName, Arity, NegExamples),
- collect_pos_examples(PredName, Arity, PosExamples),
- collect_conseq_args(Arity, ArgsList),
- Conseq =.. [PredName| ArgsList],
- PredToDel =.. [predicate, PredName, Arity],
- retract(PredToDel),
- write('POS:\n'),
- write(PosExamples),
- write('\n\n'),
- write('NEG:\n'),
- write(NegExamples),
- write('\n\n'),
- write('CONSEQ:\n'),
- write(Conseq),
- write('\n\n'),
- write('ARITY:\n'),
- write(Arity),
- write('\n\n'),
- learn_rules_wrapper(PosExamples, NegExamples, Conseq, Arity, 0, Rules).
- /* koniec learn */
- /* zbierz argumenty nastepnika */
- collect_conseq_args(Arity, ArgsList):-
- findall(Arg, insert_used(Arity, Arg), ArgsList).
- /* koniec zbierz argumenty nastepnika */
- /* zbierz przykaldy negatywne */
- collect_neg_examples(PredName, Arity, NegExamples):-
- findall(NegEx, get_one_neg_example(PredName, Arity, NegEx), NegExamples).
- get_one_neg_example(PredName, Arity, NegEx):-
- collect_args_from_known_facts_wrapper(ArgsSet),
- permutate(ArgsSet, Arity, PermutatedArgs),
- NegEx =.. [PredName|PermutatedArgs],
- not(known_fact(NegEx)).
- /* koniec zbierz przykaldy negatywne */
- /* permutacja argumentow */
- permutate(_, 0, []).
- permutate(ArgsSet, N, [Elem|Rest]):-
- N > 0,
- member1(Elem, ArgsSet),
- delete(ArgsSet, Elem, NewArgsSet),
- N1 is N - 1,
- permutate(NewArgsSet, N1, Rest).
- /* koniec permutacja argumentow */
- /* zbierz argumenty z known_fact */
- collect_args_from_known_facts_wrapper(ArgsSet):-
- findall(KnownFact, known_fact(KnownFact), KnownFactsList),
- collect_args_from_known_facts([], KnownFactsList, ArgsSet).
- collect_args_from_known_facts(Set, [], Set).
- collect_args_from_known_facts(ArgsSetIn, [KnownFact|RestKnownFacts], ArgsSetOut):-
- KnownFact =.. [_|ArgsList],
- insert_list_into_set(ArgsSetIn, ArgsList, ArgsSetOut2),
- collect_args_from_known_facts(ArgsSetOut2, RestKnownFacts, ArgsSetOut).
- insert_list_into_set(Set, [], Set).
- insert_list_into_set(Set, [Elem|RestList], [Elem|SetOut]):-
- not(member1(Elem, Set)),
- not(member1(Elem, RestList)),
- insert_list_into_set(Set, RestList, SetOut).
- insert_list_into_set(Set, [Elem|RestList], SetOut):-
- member1(Elem, RestList),
- insert_list_into_set(Set, RestList, SetOut).
- insert_list_into_set(Set, [Elem|RestList], SetOut):-
- member1(Elem, Set),
- insert_list_into_set(Set, RestList, SetOut).
- /* koniec zbierz wszystkie argumenty z known_fact */
- /* zbierz przyklady pozytywne */
- collect_pos_examples(PredName, Arity, PosExamples):-
- findall(PosExample, get_one_pos_example(PredName, Arity, PosExample), PosExamples).
- get_one_pos_example(PredName, Arity, PosEx):-
- known_fact(PosEx),
- PosEx =.. [PredName|Args],
- length1(Args, N),
- Arity is N.
- /* koniec zbierz przyklady pozytywne */
- /* 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([X|L]) :-
- retract(queue(X)),
- X \= bottom, !,
- collect(L).
- collect([]).
- /* 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