- Improved pruning.

This commit is contained in:
ccremers 2004-08-18 19:43:58 +00:00
parent 0f75efc787
commit c95630f93b
2 changed files with 57 additions and 21 deletions

View File

@ -25,6 +25,7 @@ extern Term CLAIM_Secret;
extern Term CLAIM_Nisynch; extern Term CLAIM_Nisynch;
extern Term CLAIM_Niagree; extern Term CLAIM_Niagree;
extern Term TERM_Agent; extern Term TERM_Agent;
extern Term TERM_Hidden;
static System sys; static System sys;
Protocol INTRUDER; // Pointers, to be set by the Init Protocol INTRUDER; // Pointers, to be set by the Init
@ -303,8 +304,7 @@ iterate_role_sends (int (*func) ())
*@param subterm determines whether it is a subterm unification or not. *@param subterm determines whether it is a subterm unification or not.
*/ */
int int
bind_existing_to_goal (const Binding b, const int index, const int run, bind_existing_to_goal (const Binding b, const int run, const int index)
const int subterm)
{ {
Roledef rd; Roledef rd;
int flag; int flag;
@ -395,7 +395,7 @@ bind_existing_to_goal (const Binding b, const int index, const int run,
//! Bind a goal to an existing regular run, if possible //! Bind a goal to an existing regular run, if possible
int int
bind_existing_run (const Binding b, const Protocol p, const Role r, bind_existing_run (const Binding b, const Protocol p, const Role r,
const int index, const int subterm) const int index)
{ {
int run, flag; int run, flag;
@ -409,7 +409,7 @@ bind_existing_run (const Binding b, const Protocol p, const Role r,
termPrint (p->nameterm); termPrint (p->nameterm);
eprintf (", "); eprintf (", ");
termPrint (r->nameterm); termPrint (r->nameterm);
eprintf (" (%i)\n", subterm); eprintf ("\n");
} }
#endif #endif
flag = 1; flag = 1;
@ -417,7 +417,7 @@ bind_existing_run (const Binding b, const Protocol p, const Role r,
{ {
if (sys->runs[run].protocol == p && sys->runs[run].role == r) if (sys->runs[run].protocol == p && sys->runs[run].role == r)
{ {
flag = flag && bind_existing_to_goal (b, index, run, subterm); flag = flag && bind_existing_to_goal (b, run, index);
} }
} }
return flag; return flag;
@ -426,7 +426,7 @@ bind_existing_run (const Binding b, 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 Binding b, const Protocol p, const Role r, bind_new_run (const Binding b, const Protocol p, const Role r,
const int index, const int subterm) const int index)
{ {
int run; int run;
int flag; int flag;
@ -445,10 +445,10 @@ bind_new_run (const Binding b, const Protocol p, const Role r,
termPrint (p->nameterm); termPrint (p->nameterm);
eprintf (", "); eprintf (", ");
termPrint (r->nameterm); termPrint (r->nameterm);
eprintf (", run %i (subterm:%i)\n", run, subterm); eprintf (", run %i\n", run);
} }
#endif #endif
flag = bind_existing_to_goal (b, index, run, 1); flag = bind_existing_to_goal (b, run, index);
remove_read_goals (newgoals); remove_read_goals (newgoals);
roleInstanceDestroy (sys); roleInstanceDestroy (sys);
return flag; return flag;
@ -548,7 +548,9 @@ select_goal ()
if (!b->done) if (!b->done)
{ {
// We don't care about singular agent variables, so... // We don't care about singular agent variables, so...
if (! (isTermVariable (b->term) && inTermlist (b->term->stype, TERM_Agent))) if (!
(isTermVariable (b->term)
&& inTermlist (b->term->stype, TERM_Agent)))
{ {
float cons; float cons;
@ -657,7 +659,7 @@ bind_goal_new_encrypt (const Binding b)
rd->next->message = termDuplicate (t2); rd->next->message = termDuplicate (t2);
rd->next->next->message = termDuplicate (term); rd->next->next->message = termDuplicate (term);
index = 2; index = 2;
newgoals = add_read_goals (run, 0, index+1); newgoals = add_read_goals (run, 0, index + 1);
#ifdef DEBUG #ifdef DEBUG
if (DEBUGL (3)) if (DEBUGL (3))
{ {
@ -673,7 +675,7 @@ bind_goal_new_encrypt (const Binding b)
#endif #endif
if (goal_bind (b, run, index)) if (goal_bind (b, run, index))
{ {
flag = flag && iterate (); flag = flag && iterate ();
} }
goal_unbind (b); goal_unbind (b);
remove_read_goals (newgoals); remove_read_goals (newgoals);
@ -689,7 +691,7 @@ bind_goal_new_encrypt (const Binding b)
int int
bind_goal_new_intruder_run (const Binding b) bind_goal_new_intruder_run (const Binding b)
{ {
return (bind_goal_new_m0(b) && bind_goal_new_encrypt(b)); return (bind_goal_new_m0 (b) && bind_goal_new_encrypt (b));
} }
//! Bind a regular goal //! Bind a regular goal
@ -747,9 +749,9 @@ bind_goal_regular_run (const Binding b)
} }
#endif #endif
// Bind to existing run // Bind to existing run
flag = bind_existing_run (b, p, r, index, 1); flag = bind_existing_run (b, p, r, index);
// bind to new run // bind to new run
flag = flag && bind_new_run (b, p, r, index, 1); flag = flag && bind_new_run (b, p, r, index);
return flag; return flag;
} }
else else
@ -772,7 +774,8 @@ bind_goal_regular_run (const Binding b)
// Bind to all possible sends of intruder runs // Bind to all possible sends of intruder runs
int bind_goal_old_intruder_run (Binding b) int
bind_goal_old_intruder_run (Binding b)
{ {
int run; int run;
int flag; int flag;
@ -781,7 +784,7 @@ int bind_goal_old_intruder_run (Binding b)
if (DEBUGL (5)) if (DEBUGL (5))
{ {
indentPrint (); indentPrint ();
eprintf ("Try regular intruder send.\n"); eprintf ("Try existing intruder send.\n");
} }
#endif #endif
@ -793,13 +796,13 @@ int bind_goal_old_intruder_run (Binding b)
int ev; int ev;
Roledef rd; Roledef rd;
rd = sys->runs[run].start; rd = sys->runs[run].start;
ev = 0; ev = 0;
while (ev < sys->runs[run].length) while (ev < sys->runs[run].length)
{ {
if (rd->type == SEND) if (rd->type == SEND)
{ {
flag = flag && bind_existing_to_goal (b, ev, run, 1); flag = flag && bind_existing_to_goal (b, run, ev);
} }
rd = rd->next; rd = rd->next;
ev++; ev++;
@ -836,6 +839,7 @@ int
prune () prune ()
{ {
Termlist tl; Termlist tl;
List bl;
if (indentDepth > 20) if (indentDepth > 20)
{ {
@ -919,6 +923,21 @@ prune ()
return 1; return 1;
} }
// Check for "Hidden" interm goals
bl = sys->bindings;
while (bl != NULL)
{
Binding b;
b = bl->data;
if (termInTerm (b->term, TERM_Hidden))
{
// Prune the state: we can never meet this
return 1;
}
bl = bl->next;
}
return 0; return 0;
} }

View File

@ -3,6 +3,7 @@
*/ */
#include "list.h" #include "list.h"
#include "role.h"
#include "system.h" #include "system.h"
#include "binding.h" #include "binding.h"
#include "warshall.h" #include "warshall.h"
@ -14,6 +15,9 @@ static System sys;
static int *graph; static int *graph;
static int nodes; static int nodes;
extern Protocol INTRUDER; // The intruder protocol
extern Role I_M; // special role; precedes all other events always
/* /*
* *
* Assist stuff * Assist stuff
@ -93,6 +97,7 @@ void
goal_graph_create () goal_graph_create ()
{ {
int run, ev; int run, ev;
int last_m;
List bl; List bl;
goal_graph_destroy (); goal_graph_destroy ();
@ -104,6 +109,7 @@ goal_graph_create ()
// Setup run order // Setup run order
run = 0; run = 0;
last_m = -1; // last I_M run
while (run < sys->maxruns) while (run < sys->maxruns)
{ {
ev = 1; ev = 1;
@ -113,6 +119,16 @@ goal_graph_create ()
graph[graph_nodes (nodes, run, ev - 1, run, ev)] = 1; graph[graph_nodes (nodes, run, ev - 1, run, ev)] = 1;
ev++; ev++;
} }
// Enforce I_M ordering
if (sys->runs[run].protocol == INTRUDER && sys->runs[run].role == I_M)
{
if (last_m != -1)
{
graph[graph_nodes (nodes, last_m, 0, run, 0)] = 1;
}
last_m = run;
}
// Next
run++; run++;
} }
// Setup bindings order // Setup bindings order
@ -228,11 +244,12 @@ goal_add (Term term, const int run, const int ev)
term = deVar (term); term = deVar (term);
#ifdef DEBUG #ifdef DEBUG
if (term == NULL) if (term == NULL)
error ("Trying to add an emtpy goal term"); error ("Trying to add an emtpy goal term");
if (run >= sys->maxruns) if (run >= sys->maxruns)
error ("Trying to add a goal for a run that does not exist."); error ("Trying to add a goal for a run that does not exist.");
if (ev >= sys->runs[run].step) if (ev >= sys->runs[run].step)
error ("Trying to add a goal for an event that is not in the semistate yet."); error
("Trying to add a goal for an event that is not in the semistate yet.");
#endif #endif
if (realTermTuple (term)) if (realTermTuple (term))
{ {