- Added broken attempt to solve to problem, where a new instance has to
  be bound, but older variables point to role terms, e.g. RV#1->RV.
  What should happen, is that it becomes RV#1->RV#new. I thought of a
  solution, but it is still somewhat broken. Maybe I should ignore any
  mappings of variables such as RV, which might be included.
This commit is contained in:
ccremers 2004-08-15 19:58:26 +00:00
parent 91a679a129
commit c518e68881
4 changed files with 62 additions and 21 deletions

View File

@ -258,7 +258,7 @@ create_intruder_goal (Term t)
int run; int run;
Roledef rd; Roledef rd;
roleInstance (sys, INTRUDER, I_GOAL, NULL); roleInstance (sys, INTRUDER, I_GOAL, NULL, NULL);
run = sys->maxruns - 1; run = sys->maxruns - 1;
rd = sys->runs[run].start; rd = sys->runs[run].start;
sys->runs[run].length = 1; sys->runs[run].length = 1;
@ -300,9 +300,12 @@ add_intruder_goal_iterate (Goal goal)
} }
//! Bind a goal to an existing regular run, if possible //! Bind a goal to an existing regular run, if possible
/**
*@todo Currently we don't use subterm. This interm binds, which is much different from subterm binding.
*/
int int
bind_existing_run (const Goal goal, const Protocol p, const Role r, bind_existing_run (const Goal goal, const Protocol p, const Role r,
const int index, const int forced_run) const int index, const int forced_run, const int subterm)
{ {
int run, flag; int run, flag;
@ -342,14 +345,17 @@ bind_existing_run (const Goal goal, const Protocol p, const Role r,
explanation = "Bind existing run"; explanation = "Bind existing run";
e_run = run; e_run = run;
e_term1 = goal.rd->message; e_term1 = goal.rd->message;
e_term2 = rd->message;
} }
#endif #endif
if (binding_add (run, index, goal.run, goal.index)) if (binding_add (run, index, goal.run, goal.index))
{
{ {
flag = (flag flag = (flag
&& termMguInTerm (goal.rd->message, rd->message, && termMguInTerm (goal.rd->message, rd->message,
mgu_iterate)); mgu_iterate));
} }
}
else else
{ {
indentPrint (); indentPrint ();
@ -367,13 +373,13 @@ bind_existing_run (const Goal goal, const Protocol p, const Role r,
//! Bind a goal to a new run //! Bind a goal to a new run
int int
bind_new_run (const Goal goal, const Protocol p, const Role r, bind_new_run (const Goal goal, const Protocol p, const Role r,
const int index) const int index, Termlist substlist)
{ {
int run; int run;
int flag; int flag;
Roledef rd; Roledef rd;
roleInstance (sys, p, r, NULL); roleInstance (sys, p, r, NULL, substlist);
run = sys->maxruns - 1; run = sys->maxruns - 1;
sys->runs[run].length = index + 1; sys->runs[run].length = index + 1;
if (binding_add (run, index, goal.run, goal.index)) if (binding_add (run, index, goal.run, goal.index))
@ -386,6 +392,7 @@ bind_new_run (const Goal goal, const Protocol p, const Role r,
e_term1 = r->nameterm; e_term1 = r->nameterm;
rd = roledef_shift (sys->runs[run].start, index); rd = roledef_shift (sys->runs[run].start, index);
e_term2 = rd->message; e_term2 = rd->message;
e_term3 = goal.rd->message;
} }
#endif #endif
@ -547,9 +554,9 @@ bind_goal_regular (const Goal goal)
flag = 1; flag = 1;
if (run == -2) if (run == -2)
{ {
flag = flag && bind_new_run (goal, p, r, index); flag = flag && bind_new_run (goal, p, r, index, substlist);
} }
return (flag && bind_existing_run (goal, p, r, index, run)); return (flag && bind_existing_run (goal, p, r, index, run, 0));
} }
if (p == INTRUDER) if (p == INTRUDER)
@ -635,9 +642,9 @@ bind_intruder_to_regular (Goal goal)
flag = 1; flag = 1;
if (run == -2) if (run == -2)
{ {
flag = flag && bind_new_run (goal, p, r, index); flag = flag && bind_new_run (goal, p, r, index, substlist);
} }
flag = flag && bind_existing_run (goal, p, r, index, run); flag = flag && bind_existing_run (goal, p, r, index, run, 1);
/** /**
* deconstruct key list goals * deconstruct key list goals
@ -1030,7 +1037,7 @@ arachne ()
} }
#endif #endif
roleInstance (sys, p, r, NULL); roleInstance (sys, p, r, NULL, NULL);
sys->runs[0].length = cl->ev + 1; sys->runs[0].length = cl->ev + 1;
/** /**

View File

@ -652,7 +652,7 @@ runInstanceCreate (Tac tc)
} }
/* equal numbers, so it seems to be safe */ /* equal numbers, so it seems to be safe */
roleInstance (sys, p, r, instParams); // technically, we don't need to do this for Arachne [fix later] roleInstance (sys, p, r, instParams, NULL); // technically, we don't need to do this for Arachne [fix later]
/* after creation analysis */ /* after creation analysis */
/* AC1: untrusted agents */ /* AC1: untrusted agents */

View File

@ -485,7 +485,7 @@ firstNonAgentRead (const System sys, int rid)
void void
roleInstance (const System sys, const Protocol protocol, const Role role, roleInstance (const System sys, const Protocol protocol, const Role role,
const Termlist paramlist) const Termlist paramlist, Termlist substlist)
{ {
int rid; int rid;
Run runs; Run runs;
@ -671,6 +671,20 @@ roleInstance (const System sys, const Protocol protocol, const Role role,
rd->message = termLocal (rd->message, fromlist, tolist, rid); rd->message = termLocal (rd->message, fromlist, tolist, rid);
rd = rd->next; rd = rd->next;
} }
runs[rid].substitutions = NULL;
while (substlist != NULL)
{
Term t;
t = substlist->term;
if (t->subst != NULL)
{
t->subst = termLocal (t->subst, fromlist, tolist, rid);
runs[rid].substitutions = termlistAdd (runs[rid].substitutions, t);
}
substlist = substlist->next;
}
termlistDelete (fromlist); termlistDelete (fromlist);
runs[rid].locals = tolist; runs[rid].locals = tolist;
runs[rid].artefacts = artefacts; runs[rid].artefacts = artefacts;
@ -700,6 +714,7 @@ roleInstanceDestroy (const System sys)
{ {
int runid; int runid;
struct run myrun; struct run myrun;
Termlist substlist;
runid = sys->maxruns - 1; runid = sys->maxruns - 1;
myrun = sys->runs[runid]; myrun = sys->runs[runid];
@ -723,6 +738,24 @@ roleInstanceDestroy (const System sys)
artefacts = artefacts->next; artefacts = artefacts->next;
} }
} }
/**
* Undo the local copies of the substitutions. We cannot restore them however, so this might
* prove a problem. We assume that the substlist fixes this at roleInstance time; it should be exact.
*/
substlist = myrun.substitutions;
while (substlist != NULL)
{
Term t;
t = substlist->term;
if (t->subst != NULL)
{
termDelete (t->subst);
t->subst = NULL;
}
substlist = substlist->next;
}
termlistDelete (myrun.artefacts); termlistDelete (myrun.artefacts);
termlistDelete (myrun.locals); termlistDelete (myrun.locals);
termlistDelete (myrun.agents); termlistDelete (myrun.agents);

View File

@ -49,6 +49,7 @@ struct run
Knowledge know; //!< Current knowledge of the run. Knowledge know; //!< Current knowledge of the run.
Termlist locals; //!< Locals of the run. Termlist locals; //!< Locals of the run.
Termlist artefacts; //!< Stuff created especially for this run. Termlist artefacts; //!< Stuff created especially for this run.
Termlist substitutions; //!< The substitutions as they came from the roledef unifier
int prevSymmRun; //!< Used for symmetry reduction. Either -1, or the previous run with the same role def and at least a single parameter. int prevSymmRun; //!< Used for symmetry reduction. Either -1, or the previous run with the same role def and at least a single parameter.
int firstNonAgentRead; //!< Used for symmetry reductions for equal agents runs; -1 if there is no candidate. int firstNonAgentRead; //!< Used for symmetry reductions for equal agents runs; -1 if there is no candidate.
int firstReal; //!< 1 if a choose was inserted, otherwise 0 int firstReal; //!< 1 if a choose was inserted, otherwise 0
@ -214,7 +215,7 @@ void runsPrint (const System sys);
Term agentOfRunRole (const System sys, const int run, const Term role); Term agentOfRunRole (const System sys, const int run, const Term role);
Term agentOfRun (const System sys, const int run); Term agentOfRun (const System sys, const int run);
void roleInstance (const System sys, const Protocol protocol, const Role role, void roleInstance (const System sys, const Protocol protocol, const Role role,
const Termlist tolist); const Termlist paramlist, Termlist substlist);
void roleInstanceDestroy (const System sys); void roleInstanceDestroy (const System sys);
void systemStart (const System sys); void systemStart (const System sys);
void indentActivate (); void indentActivate ();