1/* Simple illustration of the use of Aleph to construct features
    2   on Michalski's trains problem
    3 To run do the following:
    4       a. induce_features(Features)
    5*/

?- induce_features(Features). */

   10:- use_module(library(aleph)).   11:- if(current_predicate(use_rendering/1)).   12:- use_rendering(prolog).   13:- endif.   14:- aleph.   15:- aleph_set(i,2).   16:- aleph_set(clauselength,10).   17:- aleph_set(minacc,0.6).   18:- aleph_set(noise,3).   19:- aleph_set(minscore,3).   20:- aleph_set(minpos,3).   21:- aleph_set(nodes,5000).   22:- aleph_set(explore,true).   23:- aleph_set(max_features,10).   24
   25:- modeh(1,eastbound(+train)).   26:- modeb(1,short(+car)).   27:- modeb(1,closed(+car)).   28:- modeb(1,long(+car)).   29:- modeb(1,open_car(+car)).   30:- modeb(1,double(+car)).   31:- modeb(1,jagged(+car)).   32:- modeb(1,shape(+car,#shape)).
   33:- modeb(1,load(+car,#shape,#int)).
   34:- modeb(1,wheels(+car,#int)).
   35:- modeb(*,has_car(+train,-car)).   36
   37:- determination(eastbound/1,short/1).   38:- determination(eastbound/1,closed/1).   39:- determination(eastbound/1,long/1).   40:- determination(eastbound/1,open_car/1).   41:- determination(eastbound/1,double/1).   42:- determination(eastbound/1,jagged/1).   43:- determination(eastbound/1,shape/2).   44:- determination(eastbound/1,wheels/2).   45:- determination(eastbound/1,has_car/2).   46:- determination(eastbound/1,load/3).   47
   48% show examples as boolean vectors
   49
   50:- aleph_set(portray_examples,true).   51
   52aleph_portray(train_pos):-
   53        setting(train_pos,File),
   54        show_features(File,positive).
   55aleph_portray(train_neg):-
   56        setting(train_neg,File),
   57        show_features(File,negative).
   58
   59show_features(File,Class):-
   60        open(File,read,Stream),
   61        repeat,
   62        read(Stream,Example),
   63        (Example = end_of_file -> close(Stream);
   64                write_features(Example,Class),
   65                fail).
   66
   67write_features(Example,_):-
   68        features(_,(Example:- Body)),
   69        (Body -> write(1), write(' '); write(0), write(' ')),
   70        fail.
   71write_features(_,Class):-
   72	writeq(Class), nl.
   73:-begin_bg.   74car(car_11).  car(car_12).  car(car_13).  car(car_14).
   75car(car_21).  car(car_22).  car(car_23).
   76car(car_31).  car(car_32).  car(car_33).
   77car(car_41).  car(car_42).  car(car_43).  car(car_44).
   78car(car_51).  car(car_52).  car(car_53).
   79car(car_61).  car(car_62).
   80car(car_71).  car(car_72).  car(car_73).
   81car(car_81).  car(car_82).
   82car(car_91).  car(car_92).  car(car_93).  car(car_94).
   83car(car_101).  car(car_102).
   84
   85shape(elipse).  shape(hexagon).  shape(rectangle).  shape(u_shaped).
   86shape(triangle). shape(circle). shape(nil).
   87
   88train(east1).  train(east2).  train(east3).  train(east4).  train(east5).
   89train(west6).  train(west7).  train(west8).  train(west9).  train(west10).
   90
   91
   92% eastbound train 1
   93short(car_12).		% 0
   94closed(car_12).		% 1
   95long(car_11).		% 2
   96long(car_13).
   97short(car_14).
   98open_car(car_11).		% 3
   99open_car(car_13).
  100open_car(car_14).
  101shape(car_11,rectangle). % 4,5
  102shape(car_12,rectangle).
  103shape(car_13,rectangle).
  104shape(car_14,rectangle).
  105load(car_11,rectangle,3). % 6,7,8
  106load(car_12,triangle,1).
  107load(car_13,hexagon,1).
  108load(car_14,circle,1).
  109wheels(car_11,2).	  % 9,10
  110wheels(car_12,2).
  111wheels(car_13,3).
  112wheels(car_14,2).
  113has_car(east1,car_11). % 11,12
  114has_car(east1,car_12).
  115has_car(east1,car_13).
  116has_car(east1,car_14).
  117
  118% eastbound train 2
  119has_car(east2,car_21).
  120has_car(east2,car_22).
  121has_car(east2,car_23).
  122short(car_21).
  123short(car_22).
  124short(car_23).
  125shape(car_21,u_shaped).
  126shape(car_22,u_shaped).
  127shape(car_23,rectangle).
  128open_car(car_21).
  129open_car(car_22).
  130closed(car_23).
  131load(car_21,triangle,1).
  132load(car_22,rectangle,1).
  133load(car_23,circle,2).
  134wheels(car_21,2).
  135wheels(car_22,2).
  136wheels(car_23,2).
  137
  138% eastbound train 3
  139has_car(east3,car_31).
  140has_car(east3,car_32).
  141has_car(east3,car_33).
  142short(car_31).
  143short(car_32).
  144long(car_33).
  145shape(car_31,rectangle).
  146shape(car_32,hexagon).
  147shape(car_33,rectangle).
  148open_car(car_31).
  149closed(car_32).
  150closed(car_33).
  151load(car_31,circle,1).
  152load(car_32,triangle,1).
  153load(car_33,triangle,1).
  154wheels(car_31,2).
  155wheels(car_32,2).
  156wheels(car_33,3).
  157
  158% eastbound train 4
  159has_car(east4,car_41).
  160has_car(east4,car_42).
  161has_car(east4,car_43).
  162has_car(east4,car_44).
  163short(car_41).
  164short(car_42).
  165short(car_43).
  166short(car_44).
  167shape(car_41,u_shaped).
  168shape(car_42,rectangle).
  169shape(car_43,elipse).
  170shape(car_44,rectangle).
  171double(car_42).
  172open_car(car_41).
  173open_car(car_42).
  174closed(car_43).
  175open_car(car_44).
  176load(car_41,triangle,1).
  177load(car_42,triangle,1).
  178load(car_43,rectangle,1).
  179load(car_44,rectangle,1).
  180wheels(car_41,2).
  181wheels(car_42,2).
  182wheels(car_43,2).
  183wheels(car_44,2).
  184
  185% eastbound train 5
  186has_car(east5,car_51).
  187has_car(east5,car_52).
  188has_car(east5,car_53).
  189short(car_51).
  190short(car_52).
  191short(car_53).
  192shape(car_51,rectangle).
  193shape(car_52,rectangle).
  194shape(car_53,rectangle).
  195double(car_51).
  196open_car(car_51).
  197closed(car_52).
  198closed(car_53).
  199load(car_51,triangle,1).
  200load(car_52,rectangle,1).
  201load(car_53,circle,1).
  202wheels(car_51,2).
  203wheels(car_52,3).
  204wheels(car_53,2).
  205
  206% westbound train 6
  207has_car(west6,car_61).
  208has_car(west6,car_62).
  209long(car_61).
  210short(car_62).
  211shape(car_61,rectangle).
  212shape(car_62,rectangle).
  213closed(car_61).
  214open_car(car_62).
  215load(car_61,circle,3).
  216load(car_62,triangle,1).
  217wheels(car_61,2).
  218wheels(car_62,2).
  219
  220% westbound train 7
  221has_car(west7,car_71).
  222has_car(west7,car_72).
  223has_car(west7,car_73).
  224short(car_71).
  225short(car_72).
  226long(car_73).
  227shape(car_71,rectangle).
  228shape(car_72,u_shaped).
  229shape(car_73,rectangle).
  230double(car_71).
  231open_car(car_71).
  232open_car(car_72).
  233jagged(car_73).
  234load(car_71,circle,1).
  235load(car_72,triangle,1).
  236load(car_73,nil,0).
  237wheels(car_71,2).
  238wheels(car_72,2).
  239wheels(car_73,2).
  240
  241% westbound train 8
  242has_car(west8,car_81).
  243has_car(west8,car_82).
  244long(car_81).
  245short(car_82).
  246shape(car_81,rectangle).
  247shape(car_82,u_shaped).
  248closed(car_81).
  249open_car(car_82).
  250load(car_81,rectangle,1).
  251load(car_82,circle,1).
  252wheels(car_81,3).
  253wheels(car_82,2).
  254
  255% westbound train 9
  256has_car(west9,car_91).
  257has_car(west9,car_92).
  258has_car(west9,car_93).
  259has_car(west9,car_94).
  260short(car_91).
  261long(car_92).
  262short(car_93).
  263short(car_94).
  264shape(car_91,u_shaped).
  265shape(car_92,rectangle).
  266shape(car_93,rectangle).
  267shape(car_94,u_shaped).
  268open_car(car_91).
  269jagged(car_92).
  270open_car(car_93).
  271open_car(car_94).
  272load(car_91,circle,1).
  273load(car_92,rectangle,1).
  274load(car_93,rectangle,1).
  275load(car_93,circle,1).
  276wheels(car_91,2).
  277wheels(car_92,2).
  278wheels(car_93,2).
  279wheels(car_94,2).
  280
  281% westbound train 10
  282has_car(west10,car_101).
  283has_car(west10,car_102).
  284short(car_101).
  285long(car_102).
  286shape(car_101,u_shaped).
  287shape(car_102,rectangle).
  288open_car(car_101).
  289open_car(car_102).
  290load(car_101,rectangle,1).
  291load(car_102,rectangle,2).
  292wheels(car_101,2).
  293wheels(car_102,2).
  294:-end_bg.  295
  296:-begin_in_pos.  297eastbound(east1).
  298eastbound(east2).
  299eastbound(east3).
  300eastbound(east4).
  301eastbound(east5).
  302
  303:-end_in_pos.  304:-begin_in_neg.  305eastbound(west6).
  306eastbound(west7).
  307eastbound(west8).
  308eastbound(west9).
  309eastbound(west10).
  310
  311:-end_in_neg.