%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                           %
%       file:           memo_head.pl                                        %
%       purpose:        semantic-head-driven generation with selective      %
%                       memoization                                         %
%       author:         Sebastian Varges                                    %
%       date:           Tue Feb  4 12:35:37 MET 1997                        %
%       related files:  head.pl, top.pl, grammar.pl                         %
%                                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- dynamic memo_goal /1.
:- dynamic memo_result /1.

% call from test_suite.pl
memo_hd_proc(Root) :- memo_clear, memo_head_proc(Root).
%-------------------------

memo_head_proc(Root) :- 
        memo_goal(Goal), subsumes_chk(Goal,Root), !, 
        memo_result(Root).

memo_head_proc(Root) :- 
        head_link(Root,Pivot),
        nonchain_rule(Pivot,N,RuleType),
        instantiate_nonchain_rule(RuleType,N,Pivot,RHS),
        memo_head_proc_rhs(RHS),
        memo_connect_up(Pivot,Root),
        assertz(memo_result(Root)),
        fail.

memo_head_proc(Root) :- assertz(memo_goal(Root)),fail.

memo_head_proc(Root) :- memo_result(Root).

memo_head_proc_rhs([]).
memo_head_proc_rhs([node(F)|R]) :- 
        memo_head_proc(F), 
        memo_head_proc_rhs(R).

memo_connect_up(Pivot,Pivot).
memo_connect_up(Pivot,Root) :-
        head_link(Root,Pivot),
        chain_rule(NewPivot,N,RuleType),
        instantiate_chain_rule(RuleType,N,Pivot,NewPivot,RedRHS),
        memo_head_proc_rhs(RedRHS),
        memo_connect_up(NewPivot,Root).

%-------------------------------------------------------------
memo_clear :- retractall(memo_goal(_)),
              retractall(memo_result(_)).