Shieber argues for a uniform architecture for parsing and generation . I will argue that BUG1 and a simple version of a left-corner parser  can be regarded as two instantiations of a simple general proof procedure for Horn clauses. Such a general procedure can be defined as in:
prove(Call) :- predict_unit(SubCall,Call), connect(SubCall,Call). connect(Call,Call). connect(Child,Ancestor):- predict_rule(Child,Ancestor,Parent,Siblings), prove_ds(Siblings), connect(Parent,Ancestor). prove_ds(). prove_ds([H|T]):- prove(H), prove_ds(T).
In this definition the two clauses predict_unit and predict_rule are parameterized for a specific task such as parsing or generation. In the case of parsing predict_unit simply finds a representation of the first word of the sentence, in the case of generation it finds a representation of the pivot of the sentence. The clauses for predict_rule similarly are parameterized to define different orders of selection of the literals of the clause. For parsing a left-to-right selection is useful; for generation a head-first selection. Thus the above general proof procedure constitutes a bottom-up proof procedure where top-down filtering is defined via the and predicates. In  a generalized version of this proof procedure is defined where is replaced by a predicate that predicts a non_chain_rule.