procedure printtree(t:tree; e:Env); var v :tree; procedure printId(id:alfa); var i:integer; begin i:=1; while i<=10 do if id[i]=' ' then i:=11 else begin write(id[i]); i:=i+1 end end; procedure printTail( t :tree ); begin if t <> nil then begin write(', '); printtree(t^.hd, e); printTail(t^.tl) end end; begin{printtree} if t<>nil then case t^.tag of variable:if bound(t, v, e) then printtree(v, e) else begin printId(t^.vid); if t^.index<>0 then write('_', t^.index:1) end; constant:printId(t^.cid); intcon: write(t^.n:1); predicate, func: begin printId(t^.id); if t^.params<>nil then begin write('('); printtree(t^.params, e); write(')') end end; negate: begin write(' not '); printtree(t^.l, e) end; rule: begin printtree(t^.lhs, e); if t^.rhs<>nil then begin write(' <= '); printtree(t^.rhs, e) end; writeln('.') end; list: begin printtree(t^.hd, e); printTail(t^.tl) end; progrm: begin printtree(t^.facts, e); writeln; write('?'); printtree(t^.query, e); writeln end end{case}; end{printtree}; {\fB Print a Parse Tree. \fP}