- More logic.

This commit is contained in:
ccremers 2004-08-11 12:08:10 +00:00
parent b74567b2e0
commit f30207b059

View File

@ -6,9 +6,21 @@
* *
*/ */
#include "term.h"
#include "role.h"
#include "system.h" #include "system.h"
#include "arachne.h" #include "arachne.h"
Term INTRUDER_ROLE;
struct goalstruct
{
int run;
int index;
};
typedef struct goalstruct Goal;
//! Init Arachne engine //! Init Arachne engine
void void
arachneInit (const System sys) arachneInit (const System sys)
@ -26,6 +38,87 @@ arachneDone (const System sys)
return; return;
} }
//------------------------------------------------------------------------
// Detail
//------------------------------------------------------------------------
/*
* runs[rid].step is now the number of 'valid' events within the run, but we
* call it 'length' here.
*/
#define INVALID -1
#define isGoal(rd) (rd->type == READ)
#define isBound(rd) (rd->bind_run != INVALID)
#define length step
//------------------------------------------------------------------------
// Sub
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// Larger logical componentents
//------------------------------------------------------------------------
//! Goal selection
/**
* Should be ordered to prefer most constrained; for now, it is simply the first one encountered.
*/
Goal
select_goal (const System sys)
{
Goal goal;
int run;
goal.run = INVALID;
for (run = 0; run < sys->maxruns; run++)
{
Roledef rd;
int index;
index = 0;
rd = runPointerGet (sys, run);
while (rd != NULL && index < sys->runs[run].length)
{
if (isGoal (rd) && !isBound (rd))
{
// Return this goal
goal.run = run;
goal.index = index;
return goal;
}
index++;
rd = rd->next;
}
}
return goal;
}
//! Bind a regular goal
int
bind_goal_regular (const System sys, const Goal goal)
{
}
//! Bind an intruder goal
int
bind_goal_intruder (const System sys, const Goal goal)
{
}
//! Bind a goal in all possible ways
int
bind_goal (const System sys, const Goal goal)
{
if (isTermEqual (sys->runs[goal.run].protocol->nameterm, INTRUDER_ROLE))
{
return bind_goal_intruder (sys, goal);
}
else
{
return bind_goal_regular (sys, goal);
}
}
//! Prune determination //! Prune determination
/** /**
*@returns true iff this state is invalid for some reason *@returns true iff this state is invalid for some reason
@ -36,10 +129,16 @@ prune (const System sys)
return 0; return 0;
} }
//------------------------------------------------------------------------
// Main logic core
//------------------------------------------------------------------------
//! Main recursive procedure for Arachne //! Main recursive procedure for Arachne
int int
iterate (const System sys) iterate (const System sys)
{ {
Goal goal;
/** /**
* Possibly prune this state * Possibly prune this state
*/ */
@ -49,9 +148,23 @@ iterate (const System sys)
/** /**
* If not pruned, check whether its a final state (i.e. all goals bound) * If not pruned, check whether its a final state (i.e. all goals bound)
* - Yes: check whether property holds
* - No: iterate further
*/ */
goal = select_goal (sys);
if (goal.run == INVALID)
{
/*
* all goals bound, check for property
*/
return 1;
}
else
{
/*
* bind this goal in all possible ways and iterate
*/
return bind_goal (sys, goal);
}
} }
//! Main code for Arachne //! Main code for Arachne