blob: 34f80677567a89f5fb0eaace7b359d5a56a02a0c [file] [log] [blame]
/**************************************************************/
/* ********************************************************** */
/* * * */
/* * Definitions * */
/* * * */
/* * $Module: DEFS * */
/* * * */
/* * Copyright (C) 1998, 1999, 2000, 2001 * */
/* * MPI fuer Informatik * */
/* * * */
/* * This program 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. * */
/* * * */
/* * This program 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 this program; if not, write * */
/* * to the Free Software Foundation, Inc., 59 Temple * */
/* * Place, Suite 330, Boston, MA 02111-1307 USA * */
/* * * */
/* * * */
/* $Revision$ * */
/* $State$ * */
/* $Date$ * */
/* $Author$ * */
/* * * */
/* * Contact: * */
/* * Christoph Weidenbach * */
/* * MPI fuer Informatik * */
/* * Stuhlsatzenhausweg 85 * */
/* * 66123 Saarbruecken * */
/* * Email: weidenb@mpi-sb.mpg.de * */
/* * Germany * */
/* * * */
/* ********************************************************** */
/**************************************************************/
/* $RCSfile$ */
#ifndef _DEFS_
#define _DEFS_
/**************************************************************/
/* Includes */
/**************************************************************/
#include "clause.h"
#include "term.h"
#include "list.h"
#include "search.h"
/**************************************************************/
/* Structures */
/**************************************************************/
typedef enum { PREDOCCURONCE = 1, /* whether predicate occurs only once */
ISEQUALITY = 2 /* whether predicate is equality */
} DEF_ATTRIBUTES;
typedef struct DEF_HELP {
TERM expansion; /* The definition of the predicate term*/
TERM predicate; /* The predicate which is defined*/
TERM toprove;
LIST parentclauses; /* List of clause numbers plus list of literal indices */
const char *label; /* The label of the predicate term*/
BOOL conjecture;
NAT attributes; /* The attributes of the predicate*/
} *DEF, DEF_NODE;
/**************************************************************/
/* Inline functions */
/**************************************************************/
static __inline__ TERM def_Expansion(DEF D)
{
return D->expansion;
}
static __inline__ void def_RplacExp(DEF D, TERM E)
{
D->expansion = E;
}
static __inline__ TERM def_Predicate(DEF D)
{
return D->predicate;
}
static __inline__ void def_RplacPred(DEF D, TERM Pred)
{
D->predicate = Pred;
}
static __inline__ TERM def_ToProve(DEF D)
{
return D->toprove;
}
static __inline__ void def_RplacToProve(DEF D, TERM ToProve)
{
D->toprove = ToProve;
}
static __inline__ LIST def_ClauseNumberList(DEF D)
{
return list_PairFirst(D->parentclauses);
}
static __inline__ void def_RplacClauseNumberList(DEF D, LIST L)
{
list_Rplaca(D->parentclauses, L);
}
static __inline__ LIST def_ClauseLitsList(DEF D)
{
return list_PairSecond(D->parentclauses);
}
static __inline__ void def_RplacClauseLitsList(DEF D, LIST L)
{
list_Rplacd(D->parentclauses, L);
}
static __inline__ const char* def_Label(DEF D)
{
return D->label;
}
static __inline__ void def_RplacLabel(DEF D, const char* L)
{
D->label = L;
}
static __inline__ BOOL def_Conjecture(DEF D)
{
return D->conjecture;
}
static __inline__ void def_SetConjecture(DEF D)
{
D->conjecture = TRUE;
}
static __inline__ void def_AddAttribute(DEF D, DEF_ATTRIBUTES Attribute)
{
D->attributes = D->attributes | Attribute;
}
static __inline__ NAT def_HasAttribute(DEF D, DEF_ATTRIBUTES Attribute)
{
return (D->attributes & Attribute);
}
static __inline__ void def_RemoveAttribute(DEF D, DEF_ATTRIBUTES Attribute)
{
if (D->attributes & Attribute)
D->attributes = D->attributes - Attribute;
}
static __inline__ BOOL def_HasGuard(DEF D)
{
return (def_ToProve(D)!=term_Null());
}
/**************************************************************/
/* Functions */
/**************************************************************/
DEF def_CreateFromClauses(TERM, TERM, LIST, LIST, BOOL);
DEF def_CreateFromTerm(TERM, TERM, TERM, const char*);
LIST def_ExtractDefsFromTerm(TERM, const char*);
void def_ExtractDefsFromTermlist(PROOFSEARCH, LIST, LIST);
void def_ExtractDefsFromClauselist(PROOFSEARCH, LIST);
TERM def_ApplyDefToTermOnce(DEF, TERM, FLAGSTORE, PRECEDENCE, BOOL*);
TERM def_ApplyDefToTermExhaustive(PROOFSEARCH, TERM);
LIST def_ApplyDefToTermlist(DEF, LIST, FLAGSTORE, PRECEDENCE, BOOL*, BOOL);
LIST def_ApplyDefinitionToTermList(LIST, LIST, FLAGSTORE, PRECEDENCE);
/*
LIST def_GetTermsForProof(TERM, TERM, int);
BOOL def_FindProofForGuard(TERM, TERM, TERM, FLAGSTORE);
*/
LIST def_ApplyDefToClauseOnce(DEF, CLAUSE, FLAGSTORE, PRECEDENCE);
LIST def_ApplyDefToClauseExhaustive(PROOFSEARCH, CLAUSE);
LIST def_ApplyDefToClauselist(PROOFSEARCH, DEF, LIST, BOOL);
LIST def_FlattenWithOneDefinition(PROOFSEARCH, DEF);
void def_FlattenWithOneDefinitionSemiDestructive(PROOFSEARCH, DEF);
void def_FlattenWithOneDefinitionDestructive(PROOFSEARCH, DEF);
void def_FlattenDefinitionsDestructive(PROOFSEARCH);
void def_Delete(DEF);
void def_Print(DEF);
int def_PredicateOccurrences(TERM, SYMBOL);
#endif