/* Inductive Logic Programming in Picat v3. This is a port of the program minihyper.pl + examples in I. Bratko, "Prolog Programming for Artificial Intelligence", 4th edn., Pearson Education / Addison-Wesley 2012 Page 495ff (Figure 21.4) The module minihyper_v3 is defined in See http://hakank.org/picat/minihyper_v3.pi All comments below are from Bratko's code (except this notated with "hakank"). Using atom/1 in the backliteral/2 (as suggest at page 501) (3.9s) """ MaxD = 0 MaxD = 1 MaxD = 2 MaxD = 3 MaxD = 4 MaxD = 5 MaxD = 6 MaxD = 7 MaxD = 8 [[predecessor(_ca8,_cb8),[atom(_ca8),parent(_ca8,_d70)],[atom(_d70),predecessor(_d70,_cb8)]] / [_ca8,_d70,_cb8],[predecessor(_c48,_c58),[atom(_c48),parent(_c48,_c58)]] / [_c48,_c58]] picat3 minihyper_ex2_v3.pi 3,90s user 0,01s system 99% cpu 3,913 total """ Which nicer variable names: [[predecessor(A,B),[atom(A),parent(A,C)],[atom(C),predecessor(C,B)]] / [A,C,B],[predecessor(D,E),[atom(D),parent(D,E)]] / [D,E]] And as clauses: predecessor(A,B) :- atom(A),parent(A,C)],atom(C),predecessor(C,B) predecessor(D,E) :- atom(D),parent(D,E) And we can skip the atom/1: predecessor(A,B) :- parent(A,C)],predecessor(C,B) predecessor(D,E) :- parent(D,E) Without the atom/1 fix we get the following after 35min 54.12s: MaxD = 0 MaxD = 1 MaxD = 2 MaxD = 3 MaxD = 4 MaxD = 5 MaxD = 6 MaxD = 7 MaxD = 8 [[predecessor(_ca8,_ca8),parent(_ca8,_db0)] / [_ca8,_db0],[predecessor(_c48,_c58),parent(_ee0,_c58),predecessor(_c48,_ee0)] / [_c58,_c48,_ee0]] This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import minihyper_v3. main => go. go ?=> induce(H), println(H), % fail, nl. go => true. max_proof_length( 6). % Max. proof length, counting calls to 'non-prolog' pred. max_clause_length( 3). % Max. number of literals in a clause % hakank: This is the input data for the problem % hakank: Another a little more complex example from page 500 with % recursive definitione % Original: backliteral( parent(X,Y), [X,Y]). % A background literal with vars. [X,Y] backliteral( predecessor(X,Y), [X,Y]). % Suggestion at page 501 % backliteral([atom(X), parent(X,Y)], [X,Y]). % A background literal with vars. [X,Y] % backliteral([atom(X), predecessor(X,Y)], [X,Y]). prolog_predicate( parent(X,Y)). % Goal parent(_,_) executed directly by Prolog prolog_predicate( atom(X)). parent( pam, bob). parent( tom, bob). parent( tom, liz). parent( bob, ann). parent( bob, pat). parent( pat, jim). parent( pat, eve). ex(predecessor(pam, bob)). ex(predecessor(pam, jim)). ex(predecessor(tom, ann)). ex(predecessor(tom, jim)). ex(predecessor(tom, liz)). nex(predecessor(liz,bob)). nex(predecessor(pat,bob)). nex(predecessor(pam,liz)). nex(predecessor(liz,jim)). nex(predecessor(liz,liz)). start_hyp([[predecessor(X1,Y1)] / [X1,Y1], [predecessor(X2,Y2)] / [X2,Y2]]).