/* translation of file "pat.k" */
/* generated by:
 *  @(#)$Author$
 */
#ifndef KC_FUNCTIONS_pat_HEADER
#define KC_FUNCTIONS_pat_HEADER
#include "k.h"    /* in case a user forgets */

namespace kc { }
using namespace kc;
/* included stuff */
//
// The Termprocessor Kimwitu++
//
// Copyright (C) 1991 University of Twente, Dept TIOS.
// Copyright (C) 1998-2003 Humboldt-University of Berlin, Institute of Informatics
// All rights reserved.
//
// Kimwitu++ is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Kimwitu++ is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Kimwitu++; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

/* end included stuff */


namespace kc {
patternrepresentations syn_patternchains (patternchains a_patternchains);
patternrepresentation syn_patternchain (patternchain a_patternchain, path a_path);
patternrepresentation syn_patternchainitem (patternchainitem a_patternchainitem, path a_path);
patternrepresentations syn_outmostpatterns (outmostpatterns a_outmostpatterns);
void clone_TypeFileLine (elem_patternrepresentation tmp1, outmostpattern a_outmostpattern);
bool f_bindingidmarked (ID id);
void v_markbindingid (ID id);
void v_resetbindingidmarks ();
patternrepresentations add_predicates_to_patternrepresentations (patternrepresentations a_patternreps);
void v_add_rewriterulesinfo_to_operator (patternrepresentations a_patternreps, rewriteclauses rc);
withcasesinfo f_withcasesinfo (patternrepresentations a_patternreps, Ctext ct);
void v_add_unparsedeclsinfo_to_operator (patternrepresentations a_patternreps, unparseclauses uc);
withcasesinfo insertin_withcasesinfo (withcaseinfo new_case, withcasesinfo old_cases);
bool lt_withcaseinfo (withcaseinfo a_withcaseinfo1, withcaseinfo a_withcaseinfo2);
void warn_drop_identical_pattern (rewriteruleinfo rri);
void warn_drop_identical_pattern (withcaseinfo wci);
void warn_drop_identical_pattern (unparsedeclinfo udi);
void warn_drop_identical_pattern (patternrepresentation pr);
void check_rewrite_patterns (rewriterulesinfo rri);
void check_with_patterns (withcasesinfo wcs);
void check_unparse_patterns (unparsedeclsinfo udi);
void check_patterns (patternrepresentations prs);
patternrepresentation next (patternrepresentation p);
elem_patternrepresentation elem (patternrepresentation p);
void compare_patterns (patternrepresentation pr1, patternrepresentation pr2, patternrepresentations other_patterns);

} // namespace kc

#endif // !  KC_FUNCTIONS_pat_HEADER

