/*
 * @(#)$Id: external_wave,v 1.1.2.1 1999/11/17 10:02:17 rjb Exp $
 *
 * $Log: external_wave,v $
 * Revision 1.1.2.1  1999/11/17 10:02:17  rjb
 * Support for a lemma calculation (wave) critic.
 *
 */

method(external_wave(lemma_calculation,Dir,External then WaveMethod),
       H==>G,
       [wave_terms_at(G,_,_),
        matrix(_Vars,Matrix,G),
        write('Blocked on: '), print(Matrix), nl, !,
        /* writeq(H==>G), nl, */
        lemma_calculation(H==>G,LemmaC),
        write('LemmaC: '), print(LemmaC), nl, !,
        External = external([],[],Result),
        (applicable_submethod(LemmaC,External,_,_);
         (write('Lemma rejected.'), nl, !, fail))
       ],
       [Name=temp_wave_rule,
        ctheorem(Name):=problem(LemmaC,_,_,_),
        record_thm(Name,wave),
        add_rewrite_rules(Name),
        WaveMethod = wave(Dir,_,_,_),
        (applicable_submethod(H==>G,WaveMethod,_,[SubGoal]);
         (write('Failed to ripple using lemma.'), nl,
          lib_delete(wave(Name)), erase_thm(Name),
          !, fail)),
        write('Rippled once with lemma.'), nl,
        lib_delete(wave(Name)), erase_thm(Name),
        write('Goal after unblocking:'), nl, print(SubGoal), nl
       ],
       [SubGoal],
       external_wave(lemma_calculation,Dir,External then WaveMethod)).
