Exemplo n.º 1
0
ATerm createMustSum(ATerm sum){	
	ATerm cond, newCond, condSort, act, newAct, newSum;
	char newActName[250];
	AFun memberTag; 
	ATbool toAbs = ATfalse;
	
	memberTag = createNewFuncSym(memberSym, 
			ATmakeList2(MCRLterm_bool, liftSort(MCRLterm_bool)));
	
	cond = (ATerm) ATgetArgument((ATermAppl) sum ,4);	
	condSort = getTermSort(cond);
	
	if(isLifted(condSort)) toAbs = ATtrue;
	
	if(isAbstracted(condSort))
		cond = createGammaTerm(cond, condSort);
		
	if(toAbs){	
		newCond = (ATerm) ATmakeAppl1(MCRLsym_not,
			(ATerm) ATmakeAppl2(memberTag, MCRLterm_false, cond));
	}
	else{
		newCond = cond;
		newSum = sum;
	}
	newSum = (ATerm) ATsetArgument((ATermAppl) sum, (ATerm) newCond, 4);
	act = (ATerm) ATgetArgument((ATermAppl) sum, 1);
	appendString(MCRLgetName(act), mustSufix, newActName);
	newAct = (ATerm) ATmakeAppl0(ATmakeAFun(newActName, 0, ATtrue));
	return (ATerm) ATsetArgument((ATermAppl) newSum, newAct, 1);
}
Exemplo n.º 2
0
void abstractPars(){
	 ATermList pars = MCRLgetListOfPars();
	 ATermList newPars = ATmakeList0();
	 ATerm proc = MCRLgetProc();
	 ATerm par, parName, parSort;
	 
	 for(;!ATisEmpty(pars); pars= ATgetNext(pars)){
		par = (ATerm) ATgetFirst(pars);
		parName = (ATerm) ATgetArgument((ATermAppl) par, 0);
		parSort = (ATerm) ATgetArgument((ATermAppl) par, 1);
		if(toAbstractPar(parName)){
			parSort = liftSort(abstractSort(parSort));
		}
		if(toAbstractSort(parSort)){
			parSort = liftSort(abstractSort(parSort));
		}
		if(!toAbstractSort(parSort) && BUT_SORT){
			parSort = getConcrete(getUnLifted(parSort));
		}
				
		par = (ATerm) ATsetArgument((ATermAppl) par, parSort, 1);
		newPars = ATappend(newPars, par);
		ATtablePut(par_tab, parName, parSort);
	 }
	 proc = (ATerm) ATsetArgument((ATermAppl)proc,(ATerm) newPars, 1);
	 MCRLsetProc(proc);
}
Exemplo n.º 3
0
ATermList procAbstraction(ATermList procArgs){
	ATerm procArg, newTerm, par, parSort, parName;
	ATermList newProcArgs = ATmakeList0();	
	ATermList pars = MCRLgetListOfPars();
	ATerm termSort;
		
	for (;!ATisEmpty(procArgs); 
			procArgs = ATgetNext(procArgs), pars = ATgetNext(pars)) { 
		procArg = ATgetFirst(procArgs);	
		par = ATgetFirst(pars);
		parSort = (ATerm) ATgetArgument((ATermAppl) par, 1);
		parName = (ATerm) ATgetArgument((ATermAppl) par, 0);
		newTerm = termAbstraction(procArg, parSort);	
		
		termSort = getTermSort(newTerm);
		

		if(isAbstracted(termSort) && !isAbstracted(parSort)){
			if(!isLifted(termSort)){
				newTerm = createSingTerm(newTerm, liftSort(termSort));
				termSort = liftSort(termSort);
			}
			newTerm = createGammaTerm(newTerm, termSort);
			if(-1 == ATindexOf(conflictingPars, parName , 0))
				conflictingPars = ATappend(conflictingPars, parName);
		}
					
		newProcArgs = ATappend(newProcArgs, newTerm);
	}
	return newProcArgs;	
}
Exemplo n.º 4
0
void abstractVars(){	
	ATermList newSums, sums = MCRLgetListOfSummands();
	ATermList vars, newVars;
	ATerm proc, sum; 
	ATerm var, varSort, varName, oldVarSort;
		
	proc = MCRLgetProc();
	newSums = ATmakeList0();
	
	for(;!ATisEmpty(sums); sums= ATgetNext(sums)){
		sum = ATgetFirst(sums);	
		vars = (ATermList) ATgetArgument((ATermAppl) sum ,0);
		newVars = ATmakeList0();

		for(;!ATisEmpty(vars);  vars= ATgetNext(vars)){
			var = (ATerm) ATgetFirst(vars);
		   varName = (ATerm) ATgetArgument((ATermAppl) var, 0);
		   varSort = (ATerm) ATgetArgument((ATermAppl) var, 1);
		
			oldVarSort = ATtableGet(var_tab, varName);
			
			if(oldVarSort != NULL)
				if(varSort != getConcrete(oldVarSort)){
				PP("Variable "); ppTerm(varName);
				PP(" appears with two different types, ");
				ppTerm(varSort); PP(" and "); pTerm(oldVarSort);
				P("please modify the specification");
				exit(-1);
			}
		
		
			if(toAbstractVar(varName)){
				varSort = abstractSort(varSort);
			}
			if(toAbstractSort(varSort)){
				varSort = abstractSort(varSort);
			}
			if(!toAbstractSort(varSort) && BUT_SORT){
				varSort = getConcrete(varSort);
			}
			
			
			ATtablePut(var_tab, varName, varSort);
			
			var = (ATerm) ATsetArgument((ATermAppl) var, varSort, 1);
			newVars = ATinsert(newVars, var);		

		}
		sum = (ATerm) ATsetArgument((ATermAppl) sum, 
				(ATerm) ATreverse(newVars), 0);
		newSums = ATinsert(newSums, sum);
	}
	
	proc = (ATerm) ATsetArgument((ATermAppl) proc, 
					(ATerm)ATreverse(newSums), 2);

	MCRLsetProc(proc);
}
Exemplo n.º 5
0
ATbool ATunifySystem(ATermStack system,ATermSubst sigma) {
/* Solves {system[0]=system[1], ...,system[2n-2]=system[2n-1]}
   - returns 0: t1=t2 is not unifiable; sigma is reset.
   - returns 1: ATermSubst represents the mgu {X1->t1,..,Xn->tn}
   This implements the Pascal version of Baader/Nipkow.
   (Linear space, nearly linear time)
   - ATermTable equivalence contains the Union/Find structure
   - ATermStack assigned contains the domain of the solution
   First, the system is solved without occur-check
   Subsequently, a substitution is computed, with loop detection.
*/
  static char first_call = 1;
  char unifiable = 1;
  if (first_call) {
    first_call=0;
    assigned    =  ATstackCreate(40);
    equivalence = ATtableCreate(40,40);
  }
  assert((!sigma) || (ATstackDepth(sigma)==0));
  assert(ATstackDepth(assigned)==0);
  assert(ATisEmpty(ATtableKeys(equivalence)));
  while (ATstackDepth(system)>0) {
    ATerm t1=find(ATstackPop(system));
    ATerm t2=find(ATstackPop(system));
    int i,n;
    if (t1==t2) continue;
    if (ATisVariable(t2))
      { ATerm t3=t1; t1=t2; t2=t3; }
    if (ATisVariable(t1)) {
      ATstackPush(assigned,t1);
      ATtablePut(equivalence,t1,t2);
      /* ATprintf("%t->%t\n",t1,t2); */
    }
    else { /* both t1 and t2 start with function symbol. */
      Symbol s1 = ATgetSymbol(t1);
      Symbol s2 = ATgetSymbol(t2);
      if (s1!=s2) {
	unifiable=0;
	break;
      }
      else {
	n = ATgetArity(s1);
	ATtablePut(equivalence,t1,t2); /* note: forget about cardinality */
	for (i=0;i<n;i++) {
	  ATstackPush(system,ATgetArgument(t1,i));
	  ATstackPush(system,ATgetArgument(t2,i));
  } } } }
  if (unifiable) return unfold_solution(sigma);
  else {
    ATstackReset(system);
    ATstackReset(assigned);
    ATtableReset(equivalence);
    return ATfalse;
} }
Exemplo n.º 6
0
static ATerm unfold_rec(ATerm t) {
  /* Completely unfolds t according to equivalence.
     invariants: 
     - loop_detection contains "ancestors" of t
     - t is end point of find
     - solution contains correct results [t -> s]
     returns NULL: loop detected
     returns s: s is unfolding of t.
  */
  ATerm s;
  ATbool no_loop;
  char unifiable=1;
  if (ATisVariable(t)) return t;
  if ((s=ATtableGet(solution,t))) return s;
  ATindexedSetPut(loop_detection,t,&no_loop);
  if (no_loop) {
    Symbol sym = ATgetSymbol(t);
    int i,n=ATgetArity(sym);
    ATerm *args = (ATerm*)alloca(n*sizeof(ATerm));
    for (i=0;i<n;i++)
      if (!(args[i] = unfold_rec(find(ATgetArgument(t,i))))) {
	unifiable=0;
	break;
      }
    ATindexedSetRemove(loop_detection,t);
    if (unifiable) {
      s=(ATerm)ATmakeApplArray(sym,args);
      ATtablePut(solution,t,s);
      return s;
  } }
  /* here either !no_loop, or !unifiable holds */
  return NULL;
}
Exemplo n.º 7
0
static void writeConstructor(A2PWriter writer, A2PType expected, ATermAppl constructor){
	A2PConstructorType t = (A2PConstructorType) expected->theType;
	A2PTupleType children = ((A2PTupleType) t->children->theType);
	int nrOfChildren = typeArraySize(children->fieldTypes);
	
	ISIndexedSet sharedTypes = writer->typeSharingMap;
	int typeHash = hashType(expected);
	int constructorTypeId = ISget(sharedTypes, (void*) expected, typeHash);
	int arity = ATgetArity(ATgetAFun(constructor));
	int i;
	
	if(arity != nrOfChildren){ fprintf(stderr, "Arity (%d) is unequal to the number of children (%d); term was:\n%s\n", arity, nrOfChildren, ATwriteToString((ATerm) constructor)); exit(1);}
	
	if(constructorTypeId == -1){
		writeByteToBuffer(writer->buffer, PDB_CONSTRUCTOR_HEADER);
		
		doWriteType(writer, expected);
		
		ISstore(sharedTypes, (void*) expected, typeHash);
	}else{
		writeByteToBuffer(writer->buffer, PDB_CONSTRUCTOR_HEADER | PDB_TYPE_SHARED_FLAG);
		
		printInteger(writer->buffer, constructorTypeId);
	}
	
	printInteger(writer->buffer, arity);
	
	for(i = 0; i < arity; i++){
		doSerialize(writer, children->fieldTypes[i], ATgetArgument(constructor, i));
	}
}
Exemplo n.º 8
0
static void writeNode(A2PWriter writer, A2PType expected, ATermAppl node){
	AFun fun = ATgetAFun(node);
	int arity = ATgetArity(fun);
	char *name = ATgetName(fun);
	int i;
	
	unsigned int hash = hashString(name);
	int nodeNameId = ISstore(writer->nameSharingMap, (void*) name, hash);
	if(nodeNameId == -1){
		int nameLength = dataArraySize(name);
		
		writeByteToBuffer(writer->buffer, PDB_NODE_HEADER);
		
		printInteger(writer->buffer, nameLength);
		writeDataToBuffer(writer->buffer, name, nameLength);
	}else{
		writeByteToBuffer(writer->buffer, PDB_NODE_HEADER | PDB_NAME_SHARED_FLAG);
		
		printInteger(writer->buffer, nodeNameId);
	}
	
	printInteger(writer->buffer, arity);
	
	for(i = 0; i < arity; i++){
		doSerialize(writer, A2PvalueType(), ATgetArgument(node, i));
	}
}
Exemplo n.º 9
0
Arquivo: rw.c Projeto: jkeiren/muCRL
static ATerm CaseRewrite(ATerm t) {
    AFun f = ATgetAFun(t);
    int n = ATgetArity(f);
    ATerm u;
    // ATwarning("%t", t);
    if (n==0) return tasks->RWrewrite(t);
    u = ATtableGet(norm, t);
    if (u) return u;
    {
        int i;
        ATerm *a = calloc(n, sizeof(ATerm));
        ATbool changed = ATfalse;
        ATprotectArray(a, n);
        for (i=0; i<n; i++) {
            ATerm arg = ATgetArgument((ATermAppl) t, i);
            a[i] = CaseRewrite(arg);
            if (!ATisEqual(a[i], arg)) changed = ATtrue;
        }
        u = CaseRewriteStep(changed?(ATerm) ATmakeApplArray(f, a):t);
        ATtablePut(norm, t, u);
        ATunprotect(a);
        free(a);
        return u;
    }
}
Exemplo n.º 10
0
static void writeAnnotatedNode(A2PWriter writer, A2PType expected, ATermAppl node, ATermList annotations){
	A2PNodeType t = (A2PNodeType) expected->theType;
	
	AFun fun = ATgetAFun(node);
	int arity = ATgetArity(fun);
	char *name = ATgetName(fun);
	int nrOfAnnotations = ATgetLength(annotations);
	int i;
	ATerm annotationLabel;
	ATerm annotationValue;
	
	unsigned int hash = hashString(name);
	int nodeNameId = ISstore(writer->nameSharingMap, (void*) name, hash);
	if(nodeNameId == -1){
		int nameLength = dataArraySize(name);
		
		writeByteToBuffer(writer->buffer, PDB_ANNOTATED_NODE_HEADER);
		
		printInteger(writer->buffer, nameLength);
		writeDataToBuffer(writer->buffer, name, nameLength);
	}else{
		writeByteToBuffer(writer->buffer, PDB_ANNOTATED_NODE_HEADER | PDB_NAME_SHARED_FLAG);
	
		printInteger(writer->buffer, nodeNameId);
	}
	
	printInteger(writer->buffer, arity);
	
	for(i = 0; i < arity; i++){
		doSerialize(writer, A2PvalueType(), ATgetArgument(node, i));
	}
	
	/* Annotations. */
	if((nrOfAnnotations % 2) == 1){ fprintf(stderr, "Detected corrupt annotations (Unbalanced).\n"); exit(1); }
	
	printInteger(writer->buffer, nrOfAnnotations);
	
	do{
		char *label;
		int labelLength;
		A2PType annotationType;
		
		annotationLabel = ATgetFirst(annotations);
		annotations = ATgetNext(annotations);
		annotationValue = ATgetFirst(annotations);
		annotations = ATgetNext(annotations);
		
		if(ATgetType(annotationLabel) != AT_APPL){ fprintf(stderr, "Detected corrupt annotation; label term is not a 'string'.\n"); exit(1); }
		
		label = ATgetName(ATgetAFun((ATermAppl) annotationLabel));
		labelLength = dataArraySize(label);
		
		printInteger(writer->buffer, labelLength);
		writeDataToBuffer(writer->buffer, label, labelLength);
		
		annotationType = (A2PType) HTget(t->declaredAnnotations, (void*) label, hashString(label));
		doSerialize(writer, annotationType, annotationValue);
	}while(!ATisEmpty(annotations));
}
Exemplo n.º 11
0
static void writeAnnotatedConstructor(A2PWriter writer, A2PType expected, ATermAppl constructor, ATermList annotations){
	A2PConstructorType t = (A2PConstructorType) expected->theType;
	
	ISIndexedSet sharedTypes = writer->typeSharingMap;
	int typeHash = hashType(expected);
	int constructorTypeId = ISget(sharedTypes, (void*) expected, typeHash);
	int arity = ATgetArity(ATgetAFun(constructor));
	int nrOfAnnotations = ATgetLength(annotations);
	int i;
	ATerm annotationLabel;
	ATerm annotationValue;
	
	if(constructorTypeId == -1){
		writeByteToBuffer(writer->buffer, PDB_ANNOTATED_CONSTRUCTOR_HEADER);
		
		doWriteType(writer, expected);
		
		ISstore(sharedTypes, (void*) expected, typeHash);
	}else{
		writeByteToBuffer(writer->buffer, PDB_ANNOTATED_CONSTRUCTOR_HEADER | PDB_TYPE_SHARED_FLAG);
		
		printInteger(writer->buffer, constructorTypeId);
	}
	
	printInteger(writer->buffer, arity);
	
	for(i = 0; i < arity; i++){
		doSerialize(writer, ((A2PTupleType) t->children->theType)->fieldTypes[i], ATgetArgument(constructor, i));
	}
	
	/* Annotations. */
	if((nrOfAnnotations % 2) == 1){ fprintf(stderr, "Detected corrupt annotations (Unbalanced).\n"); exit(1); }
	
	printInteger(writer->buffer, nrOfAnnotations);
	
	do{
		char *label;
		int labelLength;
		A2PType annotationType;
		
		annotationLabel = ATgetFirst(annotations);
		annotations = ATgetNext(annotations);
		annotationValue = ATgetFirst(annotations);
		annotations = ATgetNext(annotations);
		
		if(ATgetType(annotationLabel) != AT_APPL){ fprintf(stderr, "Detected corrupt annotation; label term is not a 'string'.\n"); exit(1); }
		
		label = ATgetName(ATgetAFun((ATermAppl) annotationLabel));
		labelLength = dataArraySize(label);
		
		printInteger(writer->buffer, labelLength);
		writeDataToBuffer(writer->buffer, label, labelLength);
		
		annotationType = (A2PType) HTget(t->declaredAnnotations, (void*) label, hashString(label));
		doSerialize(writer, annotationType, annotationValue);
	}while(!ATisEmpty(annotations));
}
Exemplo n.º 12
0
void liftPars(){
	 ATermList sums, newSums;
	 ATerm sum;
	 ATerm procSpec, procArg;
	 ATermList procArgs;
	 
	 ATermList pars, newPars;
	 ATerm proc = MCRLgetProc();	
	 ATerm par, parName, parSort;
	 ATbool repeat;
	 
	 do{
	 	repeat = ATfalse;
		sums = MCRLgetListOfSummands();
		for(;!ATisEmpty(sums); sums= ATgetNext(sums)){
			sum = ATgetFirst(sums);	
			procSpec = ATgetArgument(sum, 3);
			procArgs = (ATermList)ATgetArgument((ATermAppl) procSpec,0);
			pars = MCRLgetListOfPars();
			newPars = ATmakeList0();
		
			for(;!ATisEmpty(procArgs); 
					procArgs = ATgetNext(procArgs), pars = ATgetNext(pars)) { 
				procArg = ATgetFirst(procArgs);
				par = ATgetFirst(pars);
				parSort = (ATerm) ATgetArgument((ATermAppl) par, 1);
				parName = (ATerm) ATgetArgument((ATermAppl) par, 0);
				if(!isLifted(parSort)){
					if(toLiftTerm(procArg)){
						repeat = ATtrue;
						parSort = liftSort(parSort);
					}
				}		
				par = (ATerm) ATsetArgument((ATermAppl) par, parSort, 1);
				newPars = ATappend(newPars, par);
				ATtablePut(par_tab, parName, parSort);
			}
			proc = (ATerm) ATsetArgument((ATermAppl)proc,(ATerm) newPars, 1);
			MCRLsetProc(proc);
			if(repeat) break;
			fprintf(stderr,".");
	 	}
	}while(repeat);
}   
Exemplo n.º 13
0
ATerm addVar(ATerm sum, ATerm varName, ATerm varSort){
	ATermList vars = ATmakeList0();
	ATerm var;
	AFun vTag  = ATmakeSymbol("v",2, ATfalse); 
	
	vars = (ATermList) ATgetArgument((ATermAppl) sum ,0);
	vars = ATinsert(vars,(ATerm)ATmakeAppl2(vTag,varName,varSort));
	
	return (ATerm) ATsetArgument((ATermAppl) sum, (ATerm) vars, 0);
}
Exemplo n.º 14
0
ATerm funcAbstraction(ATerm func, ATerm dstSort){ 
	ATermList argSorts;
	ATerm newTerm, newTermSort;
	ATerm arg, argSort, fSort, argSortAux;  
	ATbool  modified;
	int i, j;
	char *fName;
	AFun fun;
	
	argSorts = getFuncSortList(func);	
	fSort = getTermSort(func);
	
	fun = ATgetAFun(func); 
	fName = ATgetName(fun);
	
	if(reservedFunc(fun)) 
		return func;	

	do{
		modified = ATfalse;
		for(i=0; i< ATgetArity(ATgetAFun(func)); i++){
			arg = ATgetArgument((ATermAppl) func, i);
			argSort = ATelementAt(argSorts, i);
	 
			if(toAbstractArg(argSort, argSorts, fSort))
				argSort = liftSort(abstractSort(getUnLifted(argSort)));
			
			
			newTerm = termAbstraction(arg, argSort);
			newTermSort = getTermSort(newTerm); 
			
			
			if(newTerm != arg)
				modified = ATtrue;
			
			func = (ATerm) ATsetArgument((ATermAppl) func, newTerm, i);
			argSorts =  ATreplace(argSorts, newTermSort, i);
			
			if(toAbstractTarget(newTermSort, fSort))
				fSort = liftSort(abstractSort(getUnLifted(fSort)));
			
			if(toLiftTarget(newTermSort, fSort))
				fSort = liftSort(fSort);
				
			if(modified) break;
		}
	} while(modified);
		
	
	if(toAbstractSort(fSort) && abstractedSorts(argSorts))
		fSort = liftSort(abstractSort(getUnLifted(fSort)));

	func = createNewFuncTerm(func, argSorts, fSort);
	return func;
}
Exemplo n.º 15
0
Arquivo: rewr.c Projeto: jkeiren/muCRL
static ATerm _ProveCondition(ATerm c) {
       /* Obliged that last branch must be "if (b, T, F)" 
       Invariant will be used at each first argument of "if" */
      ATerm result = c;
      ATermList ts = ATempty;
      while (ATgetAFun(c)==MCRLsym_ite && 
           ATgetArgument((ATermAppl) c, 2) == MCRLterm_false) {
          ts = ATinsert(ts, ATgetArgument((ATermAppl) c, 0));
          c = ATgetArgument((ATermAppl) c, 1);
          }
     if (ATisEmpty(ts)) return result;
     else {
         int n = ATgetLength (ts), i;
         DECLA(ATerm, l, n);DECLA(ATerm, r, n); DECLA(ATerm, s, n);
         ATerm I = MCRLgetInvariant(0);
         for (i=n-1;i>=0;i--, ts = ATgetNext(ts)) 
            l[i] = ATgetFirst(ts);
         for (i=0;i<n;i++) {
            int j, p; 
            for (p = 0, j=n-1;j>=0;j--) 
            if (i!=j) {
                s[p] = 
                   (ATerm) ATmakeAppl3(MCRLsym_ite, l[j], 
                   p>0?s[p-1]:MCRLterm_true,MCRLterm_false);
                   p++;
                }
            r[i] = p>0?s[p-1]:MCRLterm_true;  
         }
         for (i=0;i<n;i++) {
     /* If proven (I and r) -> l  then (c = l and r) will be replaced by r */
            ATerm IandR = (ATerm) ATmakeAppl2(MCRLsym_and, I, r[i]),
            arrow = Prove((ATerm) ATmakeAppl3(MCRLsym_ite, IandR, l[i], 
                 MCRLterm_true));
            /* ATwarning("QQQA %t", MCRLprint(arrow)); */
            if (ATisEqual(arrow, MCRLterm_true)) {
                 return r[i];
                 } 
            }
      return result;
      }
    }
Exemplo n.º 16
0
static void DisabledEdges(ATermList gs) {
     ATermList smds = MCRLgetListOfSummands(),
     pars = MCRLgetListOfPars();
     int false_cnt = 0, true_cnt = 0, n = ATgetLength(smds);
     static int k = 1;
     SubstituteInPars(pars, gs);
     for (;!ATisEmpty(smds);smds=ATgetNext(smds)) {
         ATerm smd = ATgetFirst(smds),
               c = ATgetArgument((ATermAppl) smd,4),
         cw = NULL;
         if (!ATisEmpty((ATermList) ATgetArgument((ATermAppl) smd, 0)))
          ATerror("Flag -extra is used while sum variables occur");
         cw = RWrewrite(c);
         if (
           ATisEqual(cw, MCRLterm_false)) false_cnt++;
         if (
           ATisEqual(cw, MCRLterm_true)) true_cnt++;
         }
         fprintf(stdout, "Summand %d N = %d disabled %d enabled %d\n", 
         k++, n, false_cnt, true_cnt);
     }
Exemplo n.º 17
0
Arquivo: rewr.c Projeto: jkeiren/muCRL
static ATbool Reduce(void) {
    ATerm proc = MCRLgetProc();
    ATermList sums = MCRLgetListOfSummands(),
    pars = MCRLgetListOfPars();
    ATermList newsums = ATmakeList0();
     
    if (proverFlag) { 
       Declare_vars(pars);
       if (invariant) MCRLparseInvariants(invariant);
       } 
    else
       RWdeclareVariables(pars);
    for (cnt=0,newcnt = 0;!ATisEmpty(sums);sums=ATgetNext(sums),cnt++) {
         ATerm sum = ATgetFirst(sums), newsum = NULL;
         ATermList vars = (ATermList) ATgetArgument((ATermAppl) sum,0);
         ATerm actname = ATgetArgument((ATermAppl) sum, 1);
         ATermList actargs = (ATermList) ATgetArgument((ATermAppl) sum,2);
         ATerm procarg = ATgetArgument((ATermAppl) sum, 3);
         ATerm cond = ATgetArgument((ATermAppl) sum,4);
         ATbool invariantUsed = ATfalse;
         if (proverFlag) {
            if (!ATisEmpty(vars)) Declare_vars(vars); 
            cond = Prove(cond);
            if (invariant) {
              ATerm cond1 = ProveCondition(cond);
              if (!ATisEqual(cond1, cond)) {
                   invariantUsed = ATtrue;
                   cond = cond1;
                   }
              /* ATwarning("QQQ cond = %t", cond); */
              }
            cond = RWrewrite(cond);
            }
         else {
            if (!ATisEmpty(vars)) RWdeclareVariables(vars);
            cond = RWrewrite(cond);
            }
   /* if (monitor) ATwarning("Condition of summand %d is rewritten", cnt+1); */
         if (ATisEqual(cond, MCRLterm_false)) continue;
         newcnt++;
         actargs = RWrewriteList(actargs);
         if (!ATisEqual(procarg, MCRLterm_terminated)) {
              ATermList states = (ATermList) ATgetArgument((ATermAppl) procarg, 0);
              states = proverFlag?ProveList(states):RWrewriteList(states);
              procarg = (ATerm) ATmakeAppl1(MCRLsym_i, (ATerm) states);
              }
         newsum = ATmake("smd(<term>,<term>,<term>,<term>,<term>)",vars, actname,
              actargs,procarg, cond);
         newsums = ATinsert(newsums, newsum);
         if (monitor && !ATisEqual(sum, newsum)) 
               ATwarning("Summand %d is rewritten %s", cnt+1,
               invariantUsed?"(invariant is used)":""); 
         }
    MCRLsetProc(ATmake("initprocspec(<term>,<term>,<term>)",
    (ATerm) RWrewriteList((ATermList) MCRLgetListOfInitValues()), 
          pars, (ATerm) ATreverse(newsums)));
    return !ATisEqual(MCRLgetProc(), proc);      
    }
Exemplo n.º 18
0
ATerm sumAbstraction(ATerm proc){
	ATerm procSpec, cond, newTerm;
	ATermList procArgs, actArgs;
	ATermList inits;
	
	procSpec = ATgetArgument(proc, 3);
	procArgs = (ATermList)ATgetArgument((ATermAppl) procSpec,0);

	newTerm = (ATerm) procAbstraction(procArgs);
	
	procSpec = (ATerm)ATsetArgument((ATermAppl)procSpec, newTerm, 0);
	proc = (ATerm)ATsetArgument((ATermAppl)proc, procSpec, 3);
		
	actArgs = (ATermList)ATgetArgument(proc,2);
	newTerm = (ATerm)actAbstraction(actArgs);
	proc = (ATerm)ATsetArgument((ATermAppl)proc, newTerm, 2);
	
	cond = ATgetArgument(proc, 4);	
	newTerm = condAbstraction(cond);
	proc = (ATerm)ATsetArgument((ATermAppl)proc, newTerm, 4);
	
	return proc;
}
Exemplo n.º 19
0
ATerm get_new_module_name(int cid, ATerm searchPaths, const char *path, const char* id)
{
  ATermList search = (ATermList) searchPaths;
  char chosenPath[PATH_LEN] = "";
  int chosenPathLen = 0;
  char chosenId[PATH_LEN];
 
  /* We will choose the longest search path that matches the path of
   * the chosen module.
   */

  for (; !ATisEmpty(search); search = ATgetNext(search)) {
    char *current = ATgetName(ATgetAFun((ATermAppl) ATgetArgument(ATgetFirst(search), 1)));
    int currentLen = strlen(current);

    if (strncmp(current, path, currentLen) == 0) {
      if (currentLen > chosenPathLen) {
	strcpy(chosenPath, current);
	chosenPathLen = currentLen;
      }
    }
  }

  /* Now construct a compound module id to complete
   * the filename.
   */

  if (chosenPathLen > 0) {
    int i = chosenPathLen;
    
    while (path[i] == SEP) {
      i++;
    } 

    if (strcmp(chosenPath, path) == 0) {
      strcpy(chosenId, id);
    }
    else {
      sprintf(chosenId, "%s%c%s", path+i, SEP, id);
    }

    return ATmake("snd-value(new-module-name(<str>,<str>))", chosenPath, 
		  chosenId);
  }
  else {
    return ATmake("snd-value(module-name-inconsistent)");
  }
}
Exemplo n.º 20
0
void CAESAR_DELTA_STATE(CAESAR_TYPE_FILE fp,CAESAR_TYPE_STATE s1,CAESAR_TYPE_STATE s2) {
    ATermList pars = (ATermList)MCRLgetListOfPars();
    ATermList l1 = (ATermList)LTSgetState(s1->state);
    ATermList l2 = (ATermList)LTSgetState(s2->state);
    while (!ATisEmpty(pars)) {
        ATerm x1 = ATgetFirst(l1);
        ATerm x2 = ATgetFirst(l2);
        if (x1 != x2)
            ATfprintf(fp,"%t := %t; ",
                      MCRLprint(ATgetArgument(ATgetFirst(pars),0)),
                      MCRLprint(x2));
        l1 = ATgetNext(l1);
        l2 = ATgetNext(l2);
        pars = ATgetNext(pars);
    }
    //  fprintf(fp,"Diff: %d - %d",s1->state,s2->state);
}
Exemplo n.º 21
0
static void writeTuple(A2PWriter writer, A2PType expected, ATermAppl tuple){
	A2PTupleType t = (A2PTupleType) expected->theType;
	
	A2PType *fieldTypes = t->fieldTypes;
	int numberOfFieldTypes = typeArraySize(fieldTypes);
	int arity = ATgetArity(ATgetAFun(tuple));
	int i;
	
	if(numberOfFieldTypes != arity){ fprintf(stderr, "The number of children specified in the type is not equal to the arity of this tuple.\n"); exit(1); }
	
	writeByteToBuffer(writer->buffer, PDB_TUPLE_HEADER);
	
	printInteger(writer->buffer, arity);
	
	for(i = 0; i < arity; i++){
		doSerialize(writer, fieldTypes[i], ATgetArgument(tuple, i));
	}
}
Exemplo n.º 22
0
static ATbool occurs_rec(ATerm var, ATerm t, ATbool *nonempty) {
  /* invariants: 
     - var doesn't occur in terms in No_occurs 
     - nonempty iff No_occurs is not empty
  */
  ATbool b;
  if (var==t) return ATtrue;
  else if (ATisVariable(t)) return ATfalse;
  else if (*nonempty && ATindexedSetGetIndex(No_occurs,t)>=0) return ATfalse;
  else {
    int i;
    for (i=ATgetArity(ATgetSymbol(t))-1;i>=0;i--)
      if (occurs_rec(var, ATgetArgument(t,i),nonempty)) return ATtrue;
  }
  *nonempty = ATtrue;
  ATindexedSetPut(No_occurs,t,&b);
  return ATfalse;
}
Exemplo n.º 23
0
ATbool toLiftFunc(ATerm func){
	ATerm arg;
	int i;
	ATermList argSorts, args;
	ATerm fSort, argSort;
	
	fSort = getTermSort(func);

	argSorts = getFuncSortList(func);
	
	if(toAbstractSort(fSort))
		return ATtrue;
		
	for(i=0; i< ATgetArity(ATgetAFun(func)); i++){
		arg = ATgetArgument((ATermAppl) func, i);		
		if(toLiftTerm(arg))
			return ATtrue;
	}	
	return ATfalse;
}
Exemplo n.º 24
0
static ATerm substVar_rec(ATerm t, ATerm var, ATerm s, ATbool *nonempty) {
  /* invariants: 
     - Subst contains pairs (r , r[var := s]) 
     - *nonempty iff Subst is not empty 
  */
  ATerm r;
  if (var == t) return s;
  else if (ATisVariable(t)) return t;
  else if (*nonempty && (r=ATtableGet(Subst,t))) return r;
  else {
    Symbol sym = ATgetSymbol(t);
    int i,n=ATgetArity(sym);
    ATerm* args = (ATerm*)alloca(n*sizeof(ATerm));
    for (i=0;i<n;i++)
      args[i]=substVar_rec(ATgetArgument(t,i),var,s,nonempty);
    r = (ATerm)ATmakeApplArray(sym,args);
    *nonempty=ATtrue;
    ATtablePut(Subst,t,r);
    return r;
  }
}
Exemplo n.º 25
0
void CAESAR_PRINT_STATE(CAESAR_TYPE_FILE f,CAESAR_TYPE_STATE s) {
    //  fprintf(f,"PRINT_STATE %d",s->state);
    ATermList values = (ATermList)LTSgetState(s->state);
    ATermList names = MCRLgetListOfPars();
    if (state_format>=1)
        fprintf(f,"\n(");
    else
        fprintf(f,"(");
    while (!ATisEmpty(values)) {
        if (state_format>=1)
            ATfprintf(f,"%t = ",MCRLprint(ATgetArgument(ATgetFirst(names),0)));
        ATfprintf(f,"%t",MCRLprint(ATgetFirst(values)));
        values=ATgetNext(values);
        names=ATgetNext(names);
        if (!ATisEmpty(values))
            if (state_format>=1)
                fprintf(f,",\n");
            else
                fprintf(f,",");
    }
    fprintf(f,")");
}
Exemplo n.º 26
0
static ATerm substitute_rec(ATerm t, ATermSubst sigma, ATbool *nonempty) {
  /* invariants: 
     - Subst contains pairs (r , r^sigma)
     - *nonempty iff Subst is not empty 
  */
  ATerm s;
  if (ATisVariable(t)) {
    s=ATstackGet(sigma,ATgetInt((ATermInt)t));
    return (s ? s : t);
  }
  else if (*nonempty && (s=ATtableGet(Subst,t))) 
    return s;
  else {
    Symbol sym = ATgetSymbol(t);
    int i,n=ATgetArity(sym);
    ATerm* args = (ATerm*)alloca(n*sizeof(ATerm));
    for (i=0;i<n;i++)
      args[i]=substitute_rec(ATgetArgument(t,i),sigma,nonempty);
    s = (ATerm)ATmakeApplArray(sym,args);
    *nonempty=ATtrue;
    ATtablePut(Subst,t,s);
    return s;
} }
Exemplo n.º 27
0
ATermList initAbstraction(ATermList inits){
	ATermList pars = MCRLgetListOfPars();
	ATermList newInits = ATmakeList0();
	ATerm init, par, parSort, newTerm, initSort;
		
	for (;!ATisEmpty(inits); inits= ATgetNext(inits), pars = ATgetNext(pars)){
		init = ATgetFirst(inits);
		par = ATgetFirst(pars);
		parSort = (ATerm) ATgetArgument((ATermAppl) par, 1);
		newTerm = init;
		initSort = getConcrete(getUnLifted(parSort));
		if(isLifted(parSort)){
			initSort = liftSort(initSort);
			newTerm = createSingTerm(newTerm, initSort);
		}		
		if(isAbstracted(parSort)){
			newTerm = createAlphaTerm(newTerm, initSort);
		}
		newInits = ATappend(newInits, newTerm);
		
	}
	return newInits;
}
Exemplo n.º 28
0
unsigned int calc_hash(ATerm t)
{
  unsigned int hnr = 0;

  switch(ATgetType(t)) {
    case AT_APPL:
      {
	ATermAppl appl = (ATermAppl)t;
	AFun sym = ATgetAFun(appl);
	int i, arity = ATgetArity(sym);
	hnr = AT_hashSymbol(ATgetName(sym), arity);

	for(i=0; i<arity; i++) {
	  hnr = hnr * MAGIC_HASH_CONST_APPL + calc_hash(ATgetArgument(appl, i));
	}
      }
      break;

    case AT_INT:
      hnr = ATgetInt((ATermInt)t);
      break;

    case AT_LIST:
      {
	ATermList list = (ATermList)t;
	hnr = 123;
	while(!ATisEmpty(list)) {
	  hnr = hnr * MAGIC_HASH_CONST_LIST + 
	    calc_hash(ATgetFirst(list));
	  list = ATgetNext(list);
	}
      }
      break;
  }

  return hnr;
}
Exemplo n.º 29
0
ATerm ATR_getSecond(ATTuple tuple) {
  return ATgetArgument((ATermAppl)tuple, 1);
}
Exemplo n.º 30
0
ATerm ATR_getFirst(ATTuple tuple) {
  return ATgetArgument((ATermAppl)tuple, 0);
}