Guest User

kol1 zad2

a guest
Jun 19th, 2013
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 6.41 KB | None | 0 0
  1. % Figure 18.11  A program that induces if-then rules.
  2.  
  3. attribute(cena, [tanie, zwykle, drogie]).
  4. attribute(smak, [ok, pyszny, bue]).
  5. attribute(kolor, [bialy, zielony, czerwony, czarny]).
  6.  
  7.  
  8. example( wojak, [cena = tanie, smak = ok, kolor = czerwony]).
  9. example( wojak, [cena = tanie, smak = ok, kolor = zielony]).
  10. example( wojak, [cena = tanie, smak = ok, kolor = czarny]).
  11. example( zubr, [cena = tanie, smak = pyszny, kolor = zielony]).
  12. example( zubr, [cena = zwykle, smak = pyszny, kolor = zielony]).
  13. example( zywiec, [cena = zwykle, smak = bue, kolor = bialy]).
  14. example( irish, [cena = drogie, smak = pyszny, kolor = zielony]).
  15.  
  16.  
  17.  
  18. % Learning of simple if-then rules
  19.  
  20. :-  op( 300, xfx, <==).
  21.  
  22. % learn( Class): collect learning examples into a list, construct and
  23. % output a description for Class, and assert the corresponding rule about Class
  24.  
  25. learn( Class)  :-
  26.    bagof( example( ClassX, Obj), example( ClassX, Obj), Examples),        % Collect examples
  27.    learn( Examples, Class, Description),                                  % Induce rule  
  28.    nl, write( Class), write('  <== '), nl,                                % Output rule  
  29.    writelist( Description),
  30.    assert( Class  <==  Description).                                      % Assert rule
  31.  
  32. % learn( Examples, Class, Description):
  33. %    Description covers exactly the examples of class Class in list Examples
  34.  
  35. learn( Examples, Class, [])  :-
  36.    not( member( example( Class, _ ), Examples)).               % No example to cover
  37.  
  38. learn( Examples, Class, [Conj | Conjs])  :-
  39.    learn_conj1( Examples, Class, Conj),
  40.    remove( Examples, Conj, RestExamples),                    % Remove examples that match Conj  
  41.    learn( RestExamples, Class, Conjs).                       % Cover remaining examples
  42.  
  43. % learn_conj( Examples, Class, Conj):
  44. %    Conj is a list of attribute values satisfied by some examples of class Class and
  45. %    no other class
  46.  
  47. learn_conj( Examples, Class, [])  :-
  48.    not(( member( example( ClassX, _ ), Examples),            % There is no example
  49.    ClassX \== Class)), !.                                     % of different class
  50.  
  51. learn_conj( Examples, Class, [Cond | Conds])  :-
  52.    choose_cond( Examples, Class, Cond),                      % Choose attribute value  
  53.    filter( Examples, [ Cond], Examples1),
  54.    learn_conj( Examples1, Class, Conds).
  55.  
  56. choose_cond( Examples, Class, AttVal)  :-
  57.    findall( AV/Score, score( Examples, Class, AV, Score), AVs),
  58.    best( AVs, AttVal).                                       % Best score attribute value
  59.  
  60. best( [ AttVal/_], AttVal).
  61.  
  62. best( [ AV0/S0, AV1/S1 | AVSlist], AttVal)  :-
  63.    S1  >  S0, !,                                             % AV1 better than AV0  
  64.    best( [AV1/S1 | AVSlist], AttVal)
  65.    ;
  66.    best( [AV0/S0 | AVSlist], AttVal).
  67.  
  68. % filter( Examples, Condition, Examples1):
  69. %    Examples1 contains elements of Examples that satisfy Condition
  70.  
  71. filter( Examples, Cond, Examples1)  :-
  72.    findall( example( Class, Obj),
  73.                 ( member( example( Class, Obj), Examples), satisfy( Obj, Cond)),
  74.                 Examples1).
  75.  
  76. % remove( Examples, Conj, Examples1):
  77. %    removing from Examples those examples that are covered by Conj gives Examples1
  78.  
  79. remove( [], _, []).
  80.  
  81. remove( [example( Class, Obj) | Es], Conj, Es1)  :-
  82.    satisfy( Obj, Conj), !,                                     % First example matches Conj  
  83.    remove( Es, Conj, Es1).                                     % Remove it
  84.  
  85. remove( [E | Es], Conj, [E | Es1])  :-                         % Retain first example  
  86.    remove( Es, Conj, Es1).
  87.  
  88. satisfy( Object, Conj)  :-
  89.    not(( member( Att = Val, Conj),
  90.          member( Att = ValX, Object),
  91.          ValX \== Val)).
  92.  
  93. score( Examples, Class, AttVal, Score)  :-
  94.    candidate( Examples, Class, AttVal),          % A suitable attribute value  
  95.    filter( Examples, [ AttVal], Examples1),      % Examples1 satisfy condition Att = Val    
  96.    length( Examples1, N1),                       % Length of list  
  97.    count_pos( Examples1, Class, NPos1),          % Number of positive examples  
  98.    NPos1 > 0,                                    % At least one positive example matches AttVal
  99.    Score is 2 * NPos1 - N1.
  100.  
  101. candidate( Examples, Class, Att = Val)  :-
  102.    attribute( Att, Values),                      % An attribute  
  103.    member( Val, Values),                         % A value  
  104.    suitable( Att = Val, Examples, Class).
  105.  
  106. suitable( AttVal, Examples, Class)  :-            
  107.     % At least one negative example must not match AttVal
  108.    member( example( ClassX, ObjX), Examples),
  109.    ClassX \== Class,                                           % Negative example  
  110.    not( satisfy( ObjX, [ AttVal])), !.                           % that does not match
  111.  
  112. % count_pos( Examples, Class, N):
  113. %    N is the number of positive examples of Class
  114.  
  115. count_pos( [], _, 0).
  116.  
  117. count_pos( [example( ClassX,_ ) | Examples], Class, N)  :-
  118.    count_pos( Examples, Class, N1),
  119.    ( ClassX = Class, !, N is N1 + 1; N = N1).
  120.  
  121.  
  122. writelist( []).
  123.  
  124. writelist( [X | L])  :-
  125.    tab( 2), write( X), nl,
  126.    writelist( L).
  127.  
  128.  
  129. %%%%%%%%%%%%%%%%%%%%%%%%%%%55
  130. % tu je rozwiązanie
  131.  
  132. learn_conj1( Examples, Class, [])  :-
  133.    not(( member( example( ClassX, _ ), Examples),
  134.    ClassX \== Class)), !.                              
  135.  
  136. learn_conj1( Examples, Class, [Cond | Conds])  :-
  137.    findall( AV/Score, score( Examples, Class, AV, Score), AVs),   % zbieramy wyniki score (skopiowane z choose_cond)
  138.    member( Cond/_, AVs),                                            % wybieramy jedno (przy nawrotach inne)
  139.    filter1( Examples, [ Cond], Class, Examples1, Lista2, Lista3),
  140.    write('Wybrane pozytywne: '), nl, writelist(Lista2), nl,
  141.    write('Odrzucone negatywne: '), nl, writelist(Lista3), nl,
  142.    write('Kontynuowac? '), read(Odp),
  143.    process( Odp),
  144.    learn_conj1( Examples1, Class, Conds).
  145.  
  146. process( tak).
  147. process( nie) :- !, fail.
  148.  
  149.  
  150. filter1( Examples, Cond, Class, Examples1, Pos_selected, Neg_eliminated) :-
  151.    findall( example( AnyClass, Obj),
  152.             ( member( example( AnyClass, Obj), Examples), satisfy( Obj, Cond)),
  153.             Examples1),
  154.    findall( example( Class, Obj),
  155.             ( member( example( Class, Obj), Examples), satisfy( Obj, Cond)),
  156.             Pos_selected),
  157.    findall( example( OtherClass, Obj),
  158.             ( member( example( OtherClass, Obj), Examples), not( satisfy( Obj, Cond)), OtherClass \== Class),
  159.             Neg_eliminated).
Advertisement
Add Comment
Please, Sign In to add comment