andersen_terms.c   [plain text]


/*

DO NOT edit this file

*/
#include <engine/list.h>
#include <regions.h>
#include <engine/banshee.h>
#include <assert.h>
#include <stdio.h>
#include <engine/bool.h>
#include <engine/ufind.h>
#include <string.h>
#include <engine/setif-sort.h>
#include <engine/flowrow-sort.h>
#include <engine/setif-sort.h>

#define REF_ 11
#define REFPROJ0_ 12
#define REFPROJ1_ 13
#define REFPROJ2_ 14
#define LAM_ 15
#define LAMPROJ0_ 16
#define LAMPROJ1_ 17
#define LAMPROJ2_ 18

typedef gen_e label_term;
typedef gen_e_list label_term_list;

typedef struct flowrow_field *argterm_field;
typedef flowrow_map argterm_map;
typedef gen_e argterm;

typedef gen_e aterm;
typedef gen_e_list aterm_list;


stamp label_term_get_stamp(gen_e arg1);
bool label_term_is_var(gen_e arg1);
DECLARE_OPAQUE_LIST(label_term_list,gen_e)
label_term label_term_zero(void);
label_term label_term_one(void);
label_term label_term_fresh(const char *name);
label_term label_term_union(label_term_list exprs) deletes;
label_term label_term_inter(label_term_list exprs) deletes;
label_term label_term_constant(const char *name) deletes;
bool label_term_is_constant(label_term e,const char *name);
label_term_list label_term_tlb(label_term e) deletes;
void label_term_inclusion(label_term e1,label_term e2) deletes;
void label_term_unify(label_term e1,label_term e2) deletes;

void label_term_print(FILE* arg1,label_term arg2) deletes;
static bool label_term_res_proj(setif_var arg1,gen_e arg2) deletes;
static void label_term_con_match(gen_e arg1,gen_e arg2) deletes;
stamp argterm_get_stamp(gen_e arg1);
bool argterm_is_var(gen_e arg1);
DECLARE_OPAQUE_LIST(argterm_map,flowrow_field)
void argterm_print(FILE *f,argterm row) deletes;
stamp aterm_get_stamp(gen_e arg1);
bool aterm_is_var(gen_e arg1);
DECLARE_OPAQUE_LIST(aterm_list,gen_e)
aterm aterm_zero(void);
aterm aterm_one(void);
aterm aterm_fresh(const char *name);
aterm aterm_union(aterm_list exprs) deletes;
aterm aterm_inter(aterm_list exprs) deletes;
aterm aterm_constant(const char *name) deletes;
bool aterm_is_constant(aterm e,const char *name);
aterm_list aterm_tlb(aterm e) deletes;
void aterm_inclusion(aterm e1,aterm e2) deletes;
void aterm_unify(aterm e1,aterm e2) deletes;

aterm ref(label_term arg1,aterm arg2,aterm arg3) deletes;
struct ref_decon ref_decon(aterm arg1);
struct ref_
{
int type;
stamp st;
label_term f0;
aterm f1;
aterm f2;
};
struct ref_decon
{
label_term f0;
aterm f1;
aterm f2;
};
struct refProj0_
{
int type;
stamp st;
label_term f0;
};
static gen_e ref_pat0_con(gen_e arg1) deletes;
aterm ref_pat0(label_term arg1) deletes;
struct refProj1_
{
int type;
stamp st;
aterm f0;
};
static gen_e ref_pat1_con(gen_e arg1) deletes;
aterm ref_pat1(aterm arg1) deletes;
struct refProj2_
{
int type;
stamp st;
aterm f0;
};
static gen_e ref_pat2_con(gen_e arg1) deletes;
aterm ref_pat2(aterm arg1) deletes;
aterm lam(label_term arg1,argterm arg2,aterm arg3) deletes;
struct lam_decon lam_decon(aterm arg1);
struct lam_
{
int type;
stamp st;
label_term f0;
argterm f1;
aterm f2;
};
struct lam_decon
{
label_term f0;
argterm f1;
aterm f2;
};
struct lamProj0_
{
int type;
stamp st;
label_term f0;
};
static gen_e lam_pat0_con(gen_e arg1) deletes;
aterm lam_pat0(label_term arg1) deletes;
struct lamProj1_
{
int type;
stamp st;
argterm f0;
};
static gen_e lam_pat1_con(gen_e arg1) deletes;
aterm lam_pat1(argterm arg1) deletes;
struct lamProj2_
{
int type;
stamp st;
aterm f0;
};
static gen_e lam_pat2_con(gen_e arg1) deletes;
aterm lam_pat2(aterm arg1) deletes;
void aterm_print(FILE* arg1,aterm arg2) deletes;
static bool aterm_res_proj(setif_var arg1,gen_e arg2) deletes;
static void aterm_con_match(gen_e arg1,gen_e arg2) deletes;

stamp label_term_get_stamp(gen_e arg1) 
{
return setif_get_stamp((gen_e)arg1);
}

bool label_term_is_var(gen_e arg1) 
{
return setif_is_var((gen_e)arg1);
}

DEFINE_LIST(label_term_list,gen_e)
label_term label_term_zero(void)
{
 return setif_zero();
}

label_term label_term_one(void)
{
 return setif_one();
}

label_term label_term_fresh(const char *name)
{
 return setif_fresh(name);
}

static label_term label_term_fresh_small(const char *name)
{
 return setif_fresh_small(name);
}

static label_term label_term_fresh_large(const char *name)
{
 return setif_fresh_large(name);
}

label_term label_term_union(label_term_list exprs) deletes
{
 return setif_union(exprs);
}

label_term label_term_inter(label_term_list exprs) deletes
{
 return setif_inter(exprs);
}

label_term label_term_constant(const char *name) deletes
{
 return setif_constant(name);
}

bool label_term_is_constant(label_term e, const char *name) 
{
 if (setif_is_constant(e))
return (! strcmp(name,setif_get_constant_name(e)));
else return FALSE;
}

label_term_list label_term_tlb(label_term e) deletes
{
 return setif_tlb(e);
}

void label_term_inclusion(label_term e1, label_term e2) deletes
{
 setif_inclusion(label_term_con_match,label_term_res_proj,e1,e2);
}

static void label_term_inclusion_contra(label_term e1, label_term e2) deletes
{
 setif_inclusion(label_term_con_match,label_term_res_proj,e2,e1);
}

void label_term_unify(label_term e1, label_term e2) deletes
{
 setif_inclusion(label_term_con_match,label_term_res_proj,e1,e2);
setif_inclusion(label_term_con_match,label_term_res_proj,e2,e1);
}

void label_term_print(FILE* arg1,label_term arg2) deletes
{
switch(((setif_term)arg2)->type)
{
case VAR_TYPE:
fprintf(arg1,"%s",sv_get_name((setif_var)arg2));
break;
case ZERO_TYPE:
fprintf(arg1,"0");
break;
case ONE_TYPE:
fprintf(arg1,"1");
break;
case CONSTANT_TYPE:
fprintf(arg1,setif_get_constant_name(arg2));
break;
case UNION_TYPE:
{
gen_e_list list = setif_get_union(arg2);
gen_e_list_scanner scan;
gen_e temp;
gen_e_list_scan(list,&scan);
if (gen_e_list_next(&scan,&temp))
label_term_print(arg1,temp);
while (gen_e_list_next(&scan,&temp))
{
fprintf(arg1," || ");
label_term_print(arg1,temp);
}

}
break;
case INTER_TYPE:
{
gen_e_list list = setif_get_inter(arg2);
gen_e_list_scanner scan;
gen_e temp;
gen_e_list_scan(list,&scan);
if (gen_e_list_next(&scan,&temp))
label_term_print(arg1,temp);
while (gen_e_list_next(&scan,&temp))
{
fprintf(arg1," && ");
label_term_print(arg1,temp);
}

}
break;

default:
return ;
}

}

static bool label_term_res_proj(setif_var arg1,gen_e arg2) deletes
{
switch(((setif_term)arg2)->type)
{

default:
return FALSE;
}

return FALSE;
}

static void label_term_con_match(gen_e arg1,gen_e arg2) deletes
{
switch(((setif_term)arg1)->type)
{

default:
failure("Inconsistent system of constraints\n");
}

return;
}

stamp argterm_get_stamp(gen_e arg1) 
{
return flowrow_get_stamp((gen_e)arg1);
}

bool argterm_is_var(gen_e arg1) 
{
return flowrow_is_var((gen_e)arg1);
}

DEFINE_LIST(argterm_map,flowrow_field)
argterm_field argterm_make_field(const char *label, aterm expr)
{
 flowrow_field result = ralloc(flowrow_region, struct flowrow_field);
result->label = rstrdup(flowrow_region,label);
result->expr = (gen_e) expr;
return result;
}

argterm argterm_zero(void)
{
 return flowrow_zero();
}

argterm argterm_one(void)
{
 return flowrow_one();
}

argterm argterm_abs(void)
{
return flowrow_abs();
}

argterm argterm_wild(void)
{
return flowrow_wild();
}

argterm argterm_fresh(const char *name)
{
return flowrow_fresh(name);
}

static argterm argterm_fresh_small(const char *name)
{
return flowrow_fresh_small(name);
}

static argterm argterm_fresh_large(const char *name)
{
return flowrow_fresh_large(name);
}

argterm argterm_row(argterm_map fields,argterm rest) deletes
{
return flowrow_row(aterm_get_stamp,fields,rest);
}

aterm argterm_extract_field(const char *field_name, argterm row)
{
return flowrow_extract_field(field_name,row);
}

argterm argterm_extract_rest(argterm row)
{
return flowrow_extract_rest(row);
}

argterm_map argterm_extract_fields(argterm row)
{
return flowrow_extract_fields(row);
}

void argterm_inclusion(argterm row1, argterm row2) deletes
{
flowrow_inclusion(aterm_fresh,aterm_get_stamp,aterm_inclusion,aterm_zero(), row1,row2);
}

static void argterm_inclusion_contra(argterm row1, argterm row2) deletes
{
flowrow_inclusion(aterm_fresh,aterm_get_stamp,aterm_inclusion,aterm_zero(), row2,row1);
}

void argterm_unify(argterm row1, argterm row2) deletes
{
argterm_inclusion(row1,row2);
argterm_inclusion(row2,row1);
}

void argterm_print(FILE *f,argterm row) deletes
{
flowrow_print(f,aterm_get_stamp,aterm_print,row);
}

stamp aterm_get_stamp(gen_e arg1) 
{
return setif_get_stamp((gen_e)arg1);
}

bool aterm_is_var(gen_e arg1) 
{
return setif_is_var((gen_e)arg1);
}

DEFINE_LIST(aterm_list,gen_e)
aterm aterm_zero(void)
{
 return setif_zero();
}

aterm aterm_one(void)
{
 return setif_one();
}

aterm aterm_fresh(const char *name)
{
 return setif_fresh(name);
}

static aterm aterm_fresh_small(const char *name)
{
 return setif_fresh_small(name);
}

static aterm aterm_fresh_large(const char *name)
{
 return setif_fresh_large(name);
}

aterm aterm_union(aterm_list exprs) deletes
{
 return setif_union(exprs);
}

aterm aterm_inter(aterm_list exprs) deletes
{
 return setif_inter(exprs);
}

aterm aterm_constant(const char *name) deletes
{
 return setif_constant(name);
}

bool aterm_is_constant(aterm e, const char *name) 
{
 if (setif_is_constant(e))
return (! strcmp(name,setif_get_constant_name(e)));
else return FALSE;
}

aterm_list aterm_tlb(aterm e) deletes
{
 return setif_tlb(e);
}

void aterm_inclusion(aterm e1, aterm e2) deletes
{
 setif_inclusion(aterm_con_match,aterm_res_proj,e1,e2);
}

static void aterm_inclusion_contra(aterm e1, aterm e2) deletes
{
 setif_inclusion(aterm_con_match,aterm_res_proj,e2,e1);
}

void aterm_unify(aterm e1, aterm e2) deletes
{
 setif_inclusion(aterm_con_match,aterm_res_proj,e1,e2);
setif_inclusion(aterm_con_match,aterm_res_proj,e2,e1);
}

bool aterm_is_ref(aterm e)
{
 return ((setif_term)e)->type == 11;
}

aterm ref(label_term arg1,aterm arg2,aterm arg3) deletes
{
struct ref_ *ret;
stamp s[4];
s[0] = REF_;
s[1] = label_term_get_stamp((gen_e)arg1);
s[2] = aterm_get_stamp((gen_e)arg2);
s[3] = aterm_get_stamp((gen_e)arg3);
if ((ret = (struct ref_ *)term_hash_find(setif_hash,s,4)) == NULL)
{
ret = ralloc(setif_region,struct ref_);
ret->type = s[0];
ret->st = stamp_fresh();
ret->f0 = arg1;
ret->f1 = arg2;
ret->f2 = arg3;
term_hash_insert(setif_hash,(gen_e)ret,s,4);
}
return (aterm)ret;
}

struct ref_decon ref_decon(aterm arg1) 
{
if (((setif_term)arg1)->type == REF_)
{
struct ref_* c = (struct ref_ *)arg1;
return (struct ref_decon){c->f0,c->f1,c->f2};

}
else 
return (struct ref_decon){NULL,NULL,NULL};
}

static gen_e get_ref_proj0_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == REFPROJ0_)
return (gen_e)((struct refProj0_ * ) temp)->f0;
} 
return NULL;
}

label_term ref_proj0(aterm arg1) deletes
 {
label_term c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (label_term)sv_get_ub_proj(v,get_ref_proj0_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = label_term_fresh(NULL);
e = ref_pat0(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == REF_)
return ((struct ref_ * )arg1)->f0;
else if ( setif_is_zero(arg1))
return label_term_zero();
else if ( setif_is_union(arg1))
{
c = get_ref_proj0_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = label_term_fresh(NULL);
e = ref_pat0(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = label_term_fresh(NULL);
e = ref_pat0(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e ref_pat0_con(gen_e arg1) deletes
{
return (gen_e)ref_pat0((label_term)arg1);
}

aterm ref_pat0(label_term arg1) deletes
{
struct refProj0_* ret;
stamp s[2];
s[0] = REFPROJ0_;
s[1] = label_term_get_stamp((gen_e)arg1);
if ((ret = (struct refProj0_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct refProj0_);
ret->type = REFPROJ0_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

static gen_e get_ref_proj1_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == REFPROJ1_)
return (gen_e)((struct refProj1_ * ) temp)->f0;
} 
return NULL;
}

aterm ref_proj1(aterm arg1) deletes
 {
aterm c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (aterm)sv_get_ub_proj(v,get_ref_proj1_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = aterm_fresh(NULL);
e = ref_pat1(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == REF_)
return ((struct ref_ * )arg1)->f1;
else if ( setif_is_zero(arg1))
return aterm_zero();
else if ( setif_is_union(arg1))
{
c = get_ref_proj1_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = aterm_fresh(NULL);
e = ref_pat1(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = aterm_fresh(NULL);
e = ref_pat1(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e ref_pat1_con(gen_e arg1) deletes
{
return (gen_e)ref_pat1((aterm)arg1);
}

aterm ref_pat1(aterm arg1) deletes
{
struct refProj1_* ret;
stamp s[2];
s[0] = REFPROJ1_;
s[1] = aterm_get_stamp((gen_e)arg1);
if ((ret = (struct refProj1_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct refProj1_);
ret->type = REFPROJ1_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

static gen_e get_ref_proj2_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == REFPROJ2_)
return (gen_e)((struct refProj2_ * ) temp)->f0;
} 
return NULL;
}

aterm ref_proj2(aterm arg1) deletes
 {
aterm c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (aterm)sv_get_ub_proj(v,get_ref_proj2_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = aterm_fresh(NULL);
e = ref_pat2(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == REF_)
return ((struct ref_ * )arg1)->f2;
else if ( setif_is_zero(arg1))
return aterm_zero();
else if ( setif_is_union(arg1))
{
c = get_ref_proj2_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = aterm_fresh(NULL);
e = ref_pat2(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = aterm_fresh(NULL);
e = ref_pat2(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e ref_pat2_con(gen_e arg1) deletes
{
return (gen_e)ref_pat2((aterm)arg1);
}

aterm ref_pat2(aterm arg1) deletes
{
struct refProj2_* ret;
stamp s[2];
s[0] = REFPROJ2_;
s[1] = aterm_get_stamp((gen_e)arg1);
if ((ret = (struct refProj2_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct refProj2_);
ret->type = REFPROJ2_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

bool aterm_is_lam(aterm e)
{
 return ((setif_term)e)->type == 15;
}

aterm lam(label_term arg1,argterm arg2,aterm arg3) deletes
{
struct lam_ *ret;
stamp s[4];
s[0] = LAM_;
s[1] = label_term_get_stamp((gen_e)arg1);
s[2] = argterm_get_stamp((gen_e)arg2);
s[3] = aterm_get_stamp((gen_e)arg3);
if ((ret = (struct lam_ *)term_hash_find(setif_hash,s,4)) == NULL)
{
ret = ralloc(setif_region,struct lam_);
ret->type = s[0];
ret->st = stamp_fresh();
ret->f0 = arg1;
ret->f1 = arg2;
ret->f2 = arg3;
term_hash_insert(setif_hash,(gen_e)ret,s,4);
}
return (aterm)ret;
}

struct lam_decon lam_decon(aterm arg1) 
{
if (((setif_term)arg1)->type == LAM_)
{
struct lam_* c = (struct lam_ *)arg1;
return (struct lam_decon){c->f0,c->f1,c->f2};

}
else 
return (struct lam_decon){NULL,NULL,NULL};
}

static gen_e get_lam_proj0_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == LAMPROJ0_)
return (gen_e)((struct lamProj0_ * ) temp)->f0;
} 
return NULL;
}

label_term lam_proj0(aterm arg1) deletes
 {
label_term c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (label_term)sv_get_ub_proj(v,get_lam_proj0_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = label_term_fresh(NULL);
e = lam_pat0(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == LAM_)
return ((struct lam_ * )arg1)->f0;
else if ( setif_is_zero(arg1))
return label_term_zero();
else if ( setif_is_union(arg1))
{
c = get_lam_proj0_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = label_term_fresh(NULL);
e = lam_pat0(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = label_term_fresh(NULL);
e = lam_pat0(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e lam_pat0_con(gen_e arg1) deletes
{
return (gen_e)lam_pat0((label_term)arg1);
}

aterm lam_pat0(label_term arg1) deletes
{
struct lamProj0_* ret;
stamp s[2];
s[0] = LAMPROJ0_;
s[1] = label_term_get_stamp((gen_e)arg1);
if ((ret = (struct lamProj0_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct lamProj0_);
ret->type = LAMPROJ0_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

static gen_e get_lam_proj1_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == LAMPROJ1_)
return (gen_e)((struct lamProj1_ * ) temp)->f0;
} 
return NULL;
}

argterm lam_proj1(aterm arg1) deletes
 {
argterm c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (argterm)sv_get_ub_proj(v,get_lam_proj1_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = argterm_fresh(NULL);
e = lam_pat1(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == LAM_)
return ((struct lam_ * )arg1)->f1;
else if ( setif_is_zero(arg1))
return argterm_zero();
else if ( setif_is_union(arg1))
{
c = get_lam_proj1_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = argterm_fresh(NULL);
e = lam_pat1(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = argterm_fresh(NULL);
e = lam_pat1(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e lam_pat1_con(gen_e arg1) deletes
{
return (gen_e)lam_pat1((argterm)arg1);
}

aterm lam_pat1(argterm arg1) deletes
{
struct lamProj1_* ret;
stamp s[2];
s[0] = LAMPROJ1_;
s[1] = argterm_get_stamp((gen_e)arg1);
if ((ret = (struct lamProj1_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct lamProj1_);
ret->type = LAMPROJ1_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

static gen_e get_lam_proj2_arg(gen_e_list arg1)
{
gen_e temp;
gen_e_list_scanner scan;
gen_e_list_scan(arg1,&scan);
while (gen_e_list_next(&scan,&temp))
{
if (((setif_term)temp)->type == LAMPROJ2_)
return (gen_e)((struct lamProj2_ * ) temp)->f0;
} 
return NULL;
}

aterm lam_proj2(aterm arg1) deletes
 {
aterm c;
if (setif_is_var(arg1))
{
setif_var v = (setif_var)arg1;
c = (aterm)sv_get_ub_proj(v,get_lam_proj2_arg);
if (c != NULL)
return c;
else
{
aterm e;
gen_e lb; 
gen_e_list_scanner scan; 
c = aterm_fresh(NULL);
e = lam_pat2(c);
sv_add_ub_proj(v,e);
gen_e_list_scan(sv_get_lbs(v),&scan);
while (gen_e_list_next(&scan,&lb))
{
setif_inclusion(aterm_con_match,aterm_res_proj,lb,e);
}
return c;
}
}
else if ( ((setif_term)arg1)->type == LAM_)
return ((struct lam_ * )arg1)->f2;
else if ( setif_is_zero(arg1))
return aterm_zero();
else if ( setif_is_union(arg1))
{
c = get_lam_proj2_arg(setif_get_proj_cache(arg1));
if (c != NULL)
return c;
else
{
aterm e;
c = aterm_fresh(NULL);
e = lam_pat2(c);
setif_set_proj_cache(arg1,e);
aterm_inclusion(arg1,e);
return c;
}
}
else
{
aterm e;
c = aterm_fresh(NULL);
e = lam_pat2(c);
aterm_inclusion(arg1,e);
return c;
}
}

static gen_e lam_pat2_con(gen_e arg1) deletes
{
return (gen_e)lam_pat2((aterm)arg1);
}

aterm lam_pat2(aterm arg1) deletes
{
struct lamProj2_* ret;
stamp s[2];
s[0] = LAMPROJ2_;
s[1] = aterm_get_stamp((gen_e)arg1);
if ((ret = (struct lamProj2_ *)term_hash_find(setif_hash,s,2)) == NULL) 
{
ret = ralloc(setif_region,struct lamProj2_);
ret->type = LAMPROJ2_;
ret->st = stamp_fresh();
ret->f0 = arg1;
term_hash_insert(setif_hash,(gen_e)ret,s,2);
}
return (aterm)ret;
}

void aterm_print(FILE* arg1,aterm arg2) deletes
{
switch(((setif_term)arg2)->type)
{
case VAR_TYPE:
fprintf(arg1,"%s",sv_get_name((setif_var)arg2));
break;
case ZERO_TYPE:
fprintf(arg1,"0");
break;
case ONE_TYPE:
fprintf(arg1,"1");
break;
case CONSTANT_TYPE:
fprintf(arg1,setif_get_constant_name(arg2));
break;
case UNION_TYPE:
{
gen_e_list list = setif_get_union(arg2);
gen_e_list_scanner scan;
gen_e temp;
gen_e_list_scan(list,&scan);
if (gen_e_list_next(&scan,&temp))
aterm_print(arg1,temp);
while (gen_e_list_next(&scan,&temp))
{
fprintf(arg1," || ");
aterm_print(arg1,temp);
}

}
break;
case INTER_TYPE:
{
gen_e_list list = setif_get_inter(arg2);
gen_e_list_scanner scan;
gen_e temp;
gen_e_list_scan(list,&scan);
if (gen_e_list_next(&scan,&temp))
aterm_print(arg1,temp);
while (gen_e_list_next(&scan,&temp))
{
fprintf(arg1," && ");
aterm_print(arg1,temp);
}

}
break;
case REF_:
{
fprintf(arg1,"ref(");
label_term_print(arg1,((struct ref_ *)arg2)->f0);
fprintf(arg1,",");
aterm_print(arg1,((struct ref_ *)arg2)->f1);
fprintf(arg1,",");
aterm_print(arg1,((struct ref_ *)arg2)->f2);
fprintf(arg1,")");

}
break;
case LAM_:
{
fprintf(arg1,"lam(");
label_term_print(arg1,((struct lam_ *)arg2)->f0);
fprintf(arg1,",");
argterm_print(arg1,((struct lam_ *)arg2)->f1);
fprintf(arg1,",");
aterm_print(arg1,((struct lam_ *)arg2)->f2);
fprintf(arg1,")");

}
break;
case REFPROJ0_:
{
fprintf(arg1,"Proj[ref,0,");
label_term_print(arg1,((struct refProj0_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;
case REFPROJ1_:
{
fprintf(arg1,"Proj[ref,1,");
aterm_print(arg1,((struct refProj1_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;
case REFPROJ2_:
{
fprintf(arg1,"Proj[ref,2,");
aterm_print(arg1,((struct refProj2_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;
case LAMPROJ0_:
{
fprintf(arg1,"Proj[lam,0,");
label_term_print(arg1,((struct lamProj0_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;
case LAMPROJ1_:
{
fprintf(arg1,"Proj[lam,1,");
argterm_print(arg1,((struct lamProj1_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;
case LAMPROJ2_:
{
fprintf(arg1,"Proj[lam,2,");
aterm_print(arg1,((struct lamProj2_ *)arg2)->f0);
fprintf(arg1,"]");

}
break;

default:
return ;
}

}

static bool aterm_res_proj(setif_var arg1,gen_e arg2) deletes
{
switch(((setif_term)arg2)->type)
{
case REFPROJ0_:
return setif_proj_merge(arg1,(gen_e)((struct refProj0_ *)arg2)->f0,get_ref_proj0_arg,ref_pat0_con,(fresh_large_fn_ptr)label_term_fresh_large,(incl_fn_ptr)label_term_inclusion,aterm_inclusion);
break;
case REFPROJ1_:
return setif_proj_merge(arg1,(gen_e)((struct refProj1_ *)arg2)->f0,get_ref_proj1_arg,ref_pat1_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion_contra,aterm_inclusion);
break;
case REFPROJ2_:
return setif_proj_merge(arg1,(gen_e)((struct refProj2_ *)arg2)->f0,get_ref_proj2_arg,ref_pat2_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion,aterm_inclusion);
break;
case LAMPROJ0_:
return setif_proj_merge(arg1,(gen_e)((struct lamProj0_ *)arg2)->f0,get_lam_proj0_arg,lam_pat0_con,(fresh_large_fn_ptr)label_term_fresh_large,(incl_fn_ptr)label_term_inclusion,aterm_inclusion);
break;
case LAMPROJ1_:
return setif_proj_merge(arg1,(gen_e)((struct lamProj1_ *)arg2)->f0,get_lam_proj1_arg,lam_pat1_con,(fresh_large_fn_ptr)argterm_fresh_large,(incl_fn_ptr)argterm_inclusion_contra,aterm_inclusion);
break;
case LAMPROJ2_:
return setif_proj_merge(arg1,(gen_e)((struct lamProj2_ *)arg2)->f0,get_lam_proj2_arg,lam_pat2_con,(fresh_large_fn_ptr)aterm_fresh_large,(incl_fn_ptr)aterm_inclusion,aterm_inclusion);
break;

default:
return FALSE;
}

return FALSE;
}

static void aterm_con_match(gen_e arg1,gen_e arg2) deletes
{
switch(((setif_term)arg1)->type)
{
case REF_:
switch(((setif_term)arg2)->type)
{
case REF_:
{
label_term_inclusion(((struct ref_ *)arg1)->f0,((struct ref_ *)arg2)->f0);
aterm_inclusion_contra(((struct ref_ *)arg1)->f1,((struct ref_ *)arg2)->f1);
aterm_inclusion(((struct ref_ *)arg1)->f2,((struct ref_ *)arg2)->f2);

}
break;
case REFPROJ0_:
label_term_inclusion(((struct ref_ *)arg1)->f0,((struct refProj0_ *)arg2)->f0);
break;
case REFPROJ1_:
aterm_inclusion_contra(((struct ref_ *)arg1)->f1,((struct refProj1_ *)arg2)->f0);
break;
case REFPROJ2_:
aterm_inclusion(((struct ref_ *)arg1)->f2,((struct refProj2_ *)arg2)->f0);
break;
case LAMPROJ0_:
return ;
break;
case LAMPROJ1_:
return ;
break;
case LAMPROJ2_:
return ;
break;

default:
failure("Inconsistent system of constraints\n");
}

break;
case LAM_:
switch(((setif_term)arg2)->type)
{
case LAM_:
{
label_term_inclusion(((struct lam_ *)arg1)->f0,((struct lam_ *)arg2)->f0);
argterm_inclusion_contra(((struct lam_ *)arg1)->f1,((struct lam_ *)arg2)->f1);
aterm_inclusion(((struct lam_ *)arg1)->f2,((struct lam_ *)arg2)->f2);

}
break;
case LAMPROJ0_:
label_term_inclusion(((struct lam_ *)arg1)->f0,((struct lamProj0_ *)arg2)->f0);
break;
case LAMPROJ1_:
argterm_inclusion_contra(((struct lam_ *)arg1)->f1,((struct lamProj1_ *)arg2)->f0);
break;
case LAMPROJ2_:
aterm_inclusion(((struct lam_ *)arg1)->f2,((struct lamProj2_ *)arg2)->f0);
break;
case REFPROJ0_:
return ;
break;
case REFPROJ1_:
return ;
break;
case REFPROJ2_:
return ;
break;

default:
failure("Inconsistent system of constraints\n");
}

break;

default:
failure("Inconsistent system of constraints\n");
}

return;
}

void andersen_terms_init(void) 
{
engine_init();
setif_init();
setif_init();
flowrow_init();
}

void andersen_terms_reset(void) deletes
{
setif_reset();
setif_reset();
flowrow_reset();
engine_reset();
}

void andersen_terms_stats(FILE * arg1) 
{
engine_stats(arg1);
}

void andersen_terms_print_graph(FILE * arg1) 
{
print_constraint_graphs(arg1);
}