The "liftsolve.db2" Benchmark
Part of the DPPD Library.
General Description
Specialise the lifting meta-interpreter for the ground representation
(adapted from a "non-executable" one by John Gallagher,
similar to the InstanceDemo by Hill and Gallagher)
with a partially specified object program.
Some details about this meta-interpreter can also be found
in a
PEPM'95 paper by Michael Leuschel
and Danny De Schreye.
The benchmark program
/* --------------------- */
/* solve(GrRules,NgGoal) */
/* --------------------- */
solve(GrRules,[]).
solve(GrRules,[NgH|NgT]) :-
non_ground_member(term(clause,[NgH|NgBody]),GrRules),
solve(GrRules,NgBody),
solve(GrRules,NgT).
/* -------------------------------------- */
/* non_ground_member(NgExpr,GrListOfExpr) */
/* -------------------------------------- */
non_ground_member(NgX,[GrH|GrT]) :-
make_non_ground(GrH,NgX).
non_ground_member(NgX,[GrH|GrT]) :-
non_ground_member(NgX,GrT).
/* --------------------------------------------------- */
/* make_non_ground(GroundRepOfExpr,NonGroundRepOfExpr) */
/* --------------------------------------------------- */
make_non_ground(G,NG) :-
mkng(G,NG,[],Sub).
mkng(var(N),X,[],[sub(N,X)]).
mkng(var(N),X,[sub(N,X)|T],[sub(N,X)|T]).
mkng(var(N),X,[sub(M,Y)|T],[sub(M,Y)|T1]) :-
N \== M,
mkng(var(N),X,T,T1).
mkng(term(F,Args),term(F,IArgs),InSub,OutSub) :-
l_mkng(Args,IArgs,InSub,OutSub).
l_mkng([],[],Sub,Sub).
l_mkng([H|T],[IH|IT],InSub,OutSub) :-
mkng(H,IH,InSub,IntSub),
l_mkng(T,IT,IntSub,OutSub).
member(X,[X|T]).
member(X,[Y|T]) :-
member(X,T).
append([],L,L).
append([H|T],M,[H|T2]) :-
append(T,M,T2).
The partial deduction query
:- solve([ term(clause,[term(father,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(male,[var(x)])]),
term(clause,[term(mother,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(female,[var(x)])]),
term(clause,[term(male,[term(paul,[])]) ]),
Unknown],
[term(father,[X,Y])]).
The run-time queries
:- solve([term(clause,[term(father,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(male,[var(x)])]),
term(clause,[term(mother,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(female,[var(x)])]),
term(clause,[term(male,[term(paul,[])])]),
term(clause,[term(parent,[term(paul,[]),term(peter,[])])])],
[term(father,[X,Y])]).
:- solve([term(clause,[term(father,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(male,[var(x)])]),
term(clause,[term(mother,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(female,[var(x)])]),
term(clause,[term(male,[term(paul,[])])]),
term(clause,[term(father,[term(peter,[]),term(paul,[])])])],
[term(father,[X,Y])]).
:- solve([term(clause,[term(father,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(male,[var(x)])]),
term(clause,[term(mother,[var(x),var(y)]),
term(parent,[var(x),var(y)]),
term(female,[var(x)])]),
term(clause,[term(male,[term(paul,[])])]),
term(clause,[term(female,[term(maria,[])])])],
[term(father,[X,Y])]).
Example solution
To be inserted.
Michael Leuschel