cs7120 (prasad)l22-metapgm1 meta-programming [email protected]
TRANSCRIPT
cs7120 (Prasad) L22-MetaPgm 1
Meta-Programming
http://www.knoesis.org/tkprasad/
Meta-Programs : Program manipulating Programs
• Extend Prolog– introduce new search strategy or modify
existing search strategy– add expressive logical connective– extend/modify syntax/semantics
• Enable Debugger
• Support Theorem Provers and Rule-based Systems
cs7120 (Prasad) L22-MetaPgm 2
Basic Meta-Interpreterprove( true ) :- !.
prove( (G1, G2) ) :- !,
prove(G1), prove(G2).
prove( G ) :-
system(G), !, G.
prove( G ) :-
clause(G,B), prove(B).
• System-predicate holds of built-ins.cs7120 (Prasad) L22-MetaPgm 3
Upgrading the Meta-Interpreter• Adding an or-operatorprove( (G1 ; G2) ) :-
prove(G1).
prove( (G1 ; G2) ) :-
prove(G2). • Changing the order of evaluation from right to left
prove( (G1, G2) ) :- !,
prove(G2), prove(G1).
cs7120 (Prasad) L22-MetaPgm 4
Tracing Basic Meta-Interpretertracep( Goal ) :-
tracep(Goal, 0).
tracep( true, Dpth ) :- !.
tracep((G1, G2),Dpth ):-!,
tracep(G1, Dpth), tracep(G2, Dpth).
cs7120 (Prasad) L22-MetaPgm 5
(cont’d)tracep( G, D ) :-
display(’Call:’, G, D),
clause(G,B),
D1 is D+1,
tracep(B, D1),
display(’Exit:’, G, D),
display_redo(G, D).
tracep( G, D ) :-
display(’Fail:’, G, D), fail.
cs7120 (Prasad) L22-MetaPgm 6
(cont’d)display( Msg, G, D ) :-
tab(D), write(Msg),
write(G), nl.
display_redo( G, D ) :-
true
;
display(’Redo:’, G, D), fail.
cs7120 (Prasad) L22-MetaPgm 7
(Trace Output)4 ?- tracep(member(5,[1,5,3])).
Call:member(5, [1, 5, 3])
Call:member(5, [5, 3])
Exit:member(5, [5, 3])
Exit:member(5, [1, 5, 3])
true ;
Redo:member(5, [1, 5, 3])
Redo:member(5, [5, 3])
Call:member(5, [3])
Call:member(5, [])
Fail:member(5, [])
Fail:member(5, [3])
Fail:member(5, [5, 3])
Fail:member(5, [1, 5, 3])
false.
cs7120 (Prasad) L22-MetaPgm 8
Other AI Applications
• Forward chaining or Bottom-up computation
• From facts to all conclusions
• Heuristic search (incl. breadth-first search)
• Diagnosis; Explanation generation• Determine the set of facts, which when assumed,
proves the goal
• Abductive reasoning
cs7120 (Prasad) L22-MetaPgm 9
Meta-level Definition
not(A) :- call(A), !, fail.
not(A).• Meta-variables range over terms encoding a
goal.
?-setof(X, G, L).• X and L are object variables, while G is
meta-variable.
cs7120 (Prasad) L22-MetaPgm 10
Program Manipulation Example
• Write a meta-program to collect all variables in a formula A.
constant(A) :-
atom(A); integer(A) ; float(A).
collect_var(A,Q-Q) :-
constant(A).
collect_var(A,[A|Q]-Q) :-
var(A).cs7120 (Prasad) L22-MetaPgm 11
(cont’d)collect_var(A,Q) :-
A =.. [P|As],
collect_vars(As,Q).
collect_vars([],Q-Q) :- !.
collect_vars([A|As], Q-Qt) :-
collect_var(A, Q-Qs),
collect_vars(As, Qs-Qt).
?-collect_var(p(X,Y), L).
L= [X,Y| _1]-_1• Difference lists for efficient appendcs7120 (Prasad) L22-MetaPgm 12
Theorem Proving Applications and others
• Proving equivalence of boolean expressions, arithmetic expressions, etc
• Normalization of expressions
• Refutation theorem proving
• Goal reordering based on binding information for efficient execution of query
• Pretty Printing
cs7120 (Prasad) L22-MetaPgm 13
Equational Reasoning: Example• Prove two terms are equivalent given that the operators
satisfy certain equality constraints.
• Associativity:
(a + b) + c = a + (b + c)
(a * b) * c = a * (b * c)• Commutativity:
(a + b) =(b + a)
(a * b) =(b * a)
• cs7120 (Prasad) L22-MetaPgm 14
(cont’d)• Identity:
(a + 0) = a = (0 + a)
(a * 1) = a = (1 * a)• Zero:
(a * 0) = 0 = (0 * a)• Distributive Law:
(a + b) * c =(a * c + b * c)
cs7120 (Prasad) L22-MetaPgm 15
Digression : Normal Form
• Equality constraints induce an equivalence relation on terms (e.g., arithmetic expressions)
• An equivalence relation partitions the set of terms into equivalence classes
• A normal form of a term is the representative of the equivalence class to which the term belongs.
cs7120 (Prasad) L22-MetaPgm 16
Normalization Procedure
• Associative operation : Ignore nestings– collapse term trees to lists
• Commutative operation : Ignore order– sort
• Zeros and Identities– simplify + delete elements
• Distributivity– sum of products form or product of sums form
cs7120 (Prasad) L22-MetaPgm 17
Application
• Evaluation of a variable-free/constant arithmetic expression is normalization.
2 + 3 => 5
(1 + (1 + 2) + 1) => 5• Equality constraints given by axioms are
used as rewrite rules for normalization.– Definition of primitive operations– Relationship among operations
cs7120 (Prasad) L22-MetaPgm 18
An Interpreter for Object-Oriented Programs
• Class Definition
object(Object, Methods)
E.g., object(rectangle(Len,Wid), [(area(A) :- A is Len * Wid)]
).
cs7120 (Prasad) L22-MetaPgm 19
class-name +
instance variablesmessage method
(cont’d)• object/instance
rectangle(5,10)• passing a message
send(Object-instance, Message)
E.g.,
send(rectangle(5,10),area(A)).• specifying class-subclass hierarchy
E.g.,isa(square(SD),rectangle(SD,SD)).
cs7120 (Prasad) L22-MetaPgm 20
Interpreter Codesend( Object, Message) :- get_methods( Object, Methods),
process( Message, Methods). % Find Object's methods
% Execute corresponding method
get_methods( Object, Methods) :- object( Object, Methods). % Private methods
get_methods( Object, Methods) :- isa( Object, Super),
get_methods( Super, Methods).% Inherited methods
cs7120 (Prasad) L22-MetaPgm 21
(cont’d)
process( Msg, [Msg | _]).
% Use a fact
process( Msg, [ (Msg :- Body) | _]) :- call( Body).
% Use a rule
process( Msg, [_ | Methods]) :-
process( Msg, Methods).
cs7120 (Prasad) L22-MetaPgm 22
?- trace, send(square(4), area(A)).
Call: (7) send(square(4), area(_G414)) ? creep
Call: (8) get_methods(square(4), _G551) ? creep
Call: (9) object(square(4), _G551) ? creep
Fail: (9) object(square(4), _G551) ? creep
Redo: (8) get_methods(square(4), _G551) ? creep
Call: (9) isa(square(4), _G551) ? creep
Exit: (9) isa(square(4), rectangle(4, 4)) ? creep
Call: (9) get_methods(rectangle(4, 4), _G554) ? creep
Call: (10) object(rectangle(4, 4), _G554) ? creep
Exit: (10) object(rectangle(4, 4), [ (area(_G555):-_G555 is 4*4)]) ? creep
Exit: (9) get_methods(rectangle(4, 4), [ (area(_G555):-_G555 is 4*4)]) ? creep
Exit: (8) get_methods(square(4), [ (area(_G555):-_G555 is 4*4)]) ? creep
Call: (8) process(area(_G414), [ (area(_G555):-_G555 is 4*4)]) ? creep
Call: (9) _G414 is 4*4 ? creep
Exit: (9) 16 is 4*4 ? creep
Exit: (8) process(area(16), [ (area(16):-16 is 4*4)]) ? creep
Exit: (7) send(square(4), area(16)) ? creep
A = 16 .
cs7120 (Prasad) L22-MetaPgm 23