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(F),assert(features(F)),show(train_pos),show(train_neg). */

   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        show_features(pos,positive).
   54aleph_portray(train_neg):-
   55        show_features(neg,negative).
   56
   57show_features(Type,Class):-
   58        example(_,Type,Example),
   59        write_features(Example,Class),
   60        fail.
   61show_features(_,_).
   62
   63write_features(Example,_):-
   64        features(Features),
   65        member((Example :- Body),Features),
   66        (Body -> write(1), write(' '); write(0), write(' ')),
   67        fail.
   68write_features(_,Class):-
   69	writeq(Class), nl.
   70:-begin_bg.   71car(car_11).  car(car_12).  car(car_13).  car(car_14).
   72car(car_21).  car(car_22).  car(car_23).
   73car(car_31).  car(car_32).  car(car_33).
   74car(car_41).  car(car_42).  car(car_43).  car(car_44).
   75car(car_51).  car(car_52).  car(car_53).
   76car(car_61).  car(car_62).
   77car(car_71).  car(car_72).  car(car_73).
   78car(car_81).  car(car_82).
   79car(car_91).  car(car_92).  car(car_93).  car(car_94).
   80car(car_101).  car(car_102).
   81
   82shape(elipse).  shape(hexagon).  shape(rectangle).  shape(u_shaped).
   83shape(triangle). shape(circle). shape(nil).
   84
   85train(east1).  train(east2).  train(east3).  train(east4).  train(east5).
   86train(west6).  train(west7).  train(west8).  train(west9).  train(west10).
   87
   88
   89% eastbound train 1
   90short(car_12).		% 0
   91closed(car_12).		% 1
   92long(car_11).		% 2
   93long(car_13).
   94short(car_14).
   95open_car(car_11).		% 3
   96open_car(car_13).
   97open_car(car_14).
   98shape(car_11,rectangle). % 4,5
   99shape(car_12,rectangle).
  100shape(car_13,rectangle).
  101shape(car_14,rectangle).
  102load(car_11,rectangle,3). % 6,7,8
  103load(car_12,triangle,1).
  104load(car_13,hexagon,1).
  105load(car_14,circle,1).
  106wheels(car_11,2).	  % 9,10
  107wheels(car_12,2).
  108wheels(car_13,3).
  109wheels(car_14,2).
  110has_car(east1,car_11). % 11,12
  111has_car(east1,car_12).
  112has_car(east1,car_13).
  113has_car(east1,car_14).
  114
  115% eastbound train 2
  116has_car(east2,car_21).
  117has_car(east2,car_22).
  118has_car(east2,car_23).
  119short(car_21).
  120short(car_22).
  121short(car_23).
  122shape(car_21,u_shaped).
  123shape(car_22,u_shaped).
  124shape(car_23,rectangle).
  125open_car(car_21).
  126open_car(car_22).
  127closed(car_23).
  128load(car_21,triangle,1).
  129load(car_22,rectangle,1).
  130load(car_23,circle,2).
  131wheels(car_21,2).
  132wheels(car_22,2).
  133wheels(car_23,2).
  134
  135% eastbound train 3
  136has_car(east3,car_31).
  137has_car(east3,car_32).
  138has_car(east3,car_33).
  139short(car_31).
  140short(car_32).
  141long(car_33).
  142shape(car_31,rectangle).
  143shape(car_32,hexagon).
  144shape(car_33,rectangle).
  145open_car(car_31).
  146closed(car_32).
  147closed(car_33).
  148load(car_31,circle,1).
  149load(car_32,triangle,1).
  150load(car_33,triangle,1).
  151wheels(car_31,2).
  152wheels(car_32,2).
  153wheels(car_33,3).
  154
  155% eastbound train 4
  156has_car(east4,car_41).
  157has_car(east4,car_42).
  158has_car(east4,car_43).
  159has_car(east4,car_44).
  160short(car_41).
  161short(car_42).
  162short(car_43).
  163short(car_44).
  164shape(car_41,u_shaped).
  165shape(car_42,rectangle).
  166shape(car_43,elipse).
  167shape(car_44,rectangle).
  168double(car_42).
  169open_car(car_41).
  170open_car(car_42).
  171closed(car_43).
  172open_car(car_44).
  173load(car_41,triangle,1).
  174load(car_42,triangle,1).
  175load(car_43,rectangle,1).
  176load(car_44,rectangle,1).
  177wheels(car_41,2).
  178wheels(car_42,2).
  179wheels(car_43,2).
  180wheels(car_44,2).
  181
  182% eastbound train 5
  183has_car(east5,car_51).
  184has_car(east5,car_52).
  185has_car(east5,car_53).
  186short(car_51).
  187short(car_52).
  188short(car_53).
  189shape(car_51,rectangle).
  190shape(car_52,rectangle).
  191shape(car_53,rectangle).
  192double(car_51).
  193open_car(car_51).
  194closed(car_52).
  195closed(car_53).
  196load(car_51,triangle,1).
  197load(car_52,rectangle,1).
  198load(car_53,circle,1).
  199wheels(car_51,2).
  200wheels(car_52,3).
  201wheels(car_53,2).
  202
  203% westbound train 6
  204has_car(west6,car_61).
  205has_car(west6,car_62).
  206long(car_61).
  207short(car_62).
  208shape(car_61,rectangle).
  209shape(car_62,rectangle).
  210closed(car_61).
  211open_car(car_62).
  212load(car_61,circle,3).
  213load(car_62,triangle,1).
  214wheels(car_61,2).
  215wheels(car_62,2).
  216
  217% westbound train 7
  218has_car(west7,car_71).
  219has_car(west7,car_72).
  220has_car(west7,car_73).
  221short(car_71).
  222short(car_72).
  223long(car_73).
  224shape(car_71,rectangle).
  225shape(car_72,u_shaped).
  226shape(car_73,rectangle).
  227double(car_71).
  228open_car(car_71).
  229open_car(car_72).
  230jagged(car_73).
  231load(car_71,circle,1).
  232load(car_72,triangle,1).
  233load(car_73,nil,0).
  234wheels(car_71,2).
  235wheels(car_72,2).
  236wheels(car_73,2).
  237
  238% westbound train 8
  239has_car(west8,car_81).
  240has_car(west8,car_82).
  241long(car_81).
  242short(car_82).
  243shape(car_81,rectangle).
  244shape(car_82,u_shaped).
  245closed(car_81).
  246open_car(car_82).
  247load(car_81,rectangle,1).
  248load(car_82,circle,1).
  249wheels(car_81,3).
  250wheels(car_82,2).
  251
  252% westbound train 9
  253has_car(west9,car_91).
  254has_car(west9,car_92).
  255has_car(west9,car_93).
  256has_car(west9,car_94).
  257short(car_91).
  258long(car_92).
  259short(car_93).
  260short(car_94).
  261shape(car_91,u_shaped).
  262shape(car_92,rectangle).
  263shape(car_93,rectangle).
  264shape(car_94,u_shaped).
  265open_car(car_91).
  266jagged(car_92).
  267open_car(car_93).
  268open_car(car_94).
  269load(car_91,circle,1).
  270load(car_92,rectangle,1).
  271load(car_93,rectangle,1).
  272load(car_93,circle,1).
  273wheels(car_91,2).
  274wheels(car_92,2).
  275wheels(car_93,2).
  276wheels(car_94,2).
  277
  278% westbound train 10
  279has_car(west10,car_101).
  280has_car(west10,car_102).
  281short(car_101).
  282long(car_102).
  283shape(car_101,u_shaped).
  284shape(car_102,rectangle).
  285open_car(car_101).
  286open_car(car_102).
  287load(car_101,rectangle,1).
  288load(car_102,rectangle,2).
  289wheels(car_101,2).
  290wheels(car_102,2).
  291:-end_bg.  292
  293:-begin_in_pos.  294eastbound(east1).
  295eastbound(east2).
  296eastbound(east3).
  297eastbound(east4).
  298eastbound(east5).
  299
  300:-end_in_pos.  301:-begin_in_neg.  302eastbound(west6).
  303eastbound(west7).
  304eastbound(west8).
  305eastbound(west9).
  306eastbound(west10).
  307
  308:-end_in_neg.