/* Inductive Logic Programming in Picat v3. This is a port of the program hyper.pl in I. Bratko, "Prolog Programming for Artificial Intelligence", 4th edn., Pearson Education / Addison-Wesley 2012 Page 507ff (Figure 21.7 and 21.3) The module hyper_v3 is here http://hakank.org/picat/hyper_v3.pi Final result (30ms): """ Hypotheses generated: 105 Hypotheses refined: 26 To be refined: 15 member(A,[A|B]). member(C,[A|B]):- member(C,B). """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import hyper_v3. main => go. go ?=> induce(H), show_hyp(H), nl. go => true. % Moved from from hyper_v3.pi max_proof_length( 6). % Max. proof length, counting calls to preds. in hypothesis max_clauses( 4). % Max. number of clauses in hypothesis max_clause_length( 5). % Max. number of literals in a clause % Example % Figure 21.5 Problem definition for learning list membership. % Problem definition for learning about member(X,L) backliteral( member(X,L), [type(L,list)], [type(X,item)] ). % Background literal % Refinement of terms term( list, [X|L], [ type(X,item), type(L,list)]). term( list, [], []). prolog_predicate( fail). % No background predicate in Prolog start_clause( [ member(X,L) ] / [ type(X,item), type(L,list)] ). % Positive and negative examples ex( member( a, [a])). ex( member( b, [a,b])). ex( member( d, [a,b,c,d,e])). nex( member( b, [a])). nex( member( d, [a,b])). nex( member( f, [a,b,c,d,e])).