- Revisited type matching conditions.

- Introduced tuple unfolding stuff for Arachne. -m2 should work now.
This commit is contained in:
ccremers 2005-01-14 18:18:40 +00:00
parent 0158e81cac
commit 820c2caed8
7 changed files with 117 additions and 40 deletions

View File

@ -1298,7 +1298,7 @@ select_tuple_goal()
b = (Binding) bl->data;
// Ignore done stuff
if (!b->done)
if (!b->blocked && !b->done)
{
if (isTermTuple (b->term))
{
@ -1352,8 +1352,8 @@ select_goal ()
b = (Binding) bl->data;
// Ignore singular variables
if (!b->done)
// Only if not done and not blocked
if (!b->blocked && !b->done)
{
int allow;
Term gterm;
@ -1773,6 +1773,10 @@ bind_goal_old_intruder_run (Binding b)
int
bind_goal (const Binding b)
{
if (b->blocked)
{
error ("Trying to bind a blocked goal!");
}
if (!b->done)
{
int flag;
@ -1861,6 +1865,7 @@ prune_theorems ()
error ("Agent of run %i is NULL", run);
}
if (!realTermLeaf (agent)
|| agent->stype == NULL
|| (agent->stype != NULL
&& !inTermlist (agent->stype, TERM_Agent)))
{
@ -1988,8 +1993,10 @@ prune_theorems ()
}
// Check for encryption levels
if (sys->match < 2
&& (term_encryption_level (b->term) > max_encryption_level))
/*
* if (sys->match < 2
*/
if (term_encryption_level (b->term) > max_encryption_level)
{
// Prune: we do not need to construct such terms
if (sys->output == PROOF)
@ -2274,7 +2281,11 @@ iterate ()
{
// Expand tuple goal
int count;
Term tt;
// mark as blocked for iteration
binding_block (b);
// simply adding will detect the tuple and add the new subgoals
count = goal_add (b->term, b->run_to, b->ev_to, b->level);
// Show this in output
if (sys->output == PROOF)
@ -2282,21 +2293,15 @@ iterate ()
indentPrint ();
eprintf ("Expanding tuple goal ");
termPrint (b->term);
eprintf ("\n");
eprintf (" into %i subgoals.\n", count);
}
// mark as done for iteration
b->done = 1;
// simply adding will detect the tuple and add the new subgoals
count = goal_add (b->term, b->run_to, b->ev_to, b->level);
// iterate
flag = iterate ();
// undo
goal_remove_last (count);
b->done = 0;
binding_unblock (b);
}
else
{

View File

@ -42,6 +42,7 @@ binding_create (Term term, int run_to, int ev_to)
b = memAlloc (sizeof (struct binding));
b->done = 0;
b->blocked = 0;
b->run_from = -1;
b->ev_from = -1;
b->run_to = run_to;
@ -179,7 +180,7 @@ goal_graph_create ()
Binding b;
b = (Binding) bl->data;
if (b->done)
if (valid_binding (b))
{
#ifdef DEBUG
if (graph_nodes
@ -417,6 +418,8 @@ binding_print (const Binding b)
eprintf ("Unbound --( ");
termPrint (b->term);
eprintf (" )->> (%i,%i)", b->run_to, b->ev_to);
if (b->blocked)
eprintf ("[blocked]");
return 1;
}
@ -444,24 +447,9 @@ goal_add (Term term, const int run, const int ev, const int level)
#endif
if (realTermTuple (term))
{
int width;
int flag;
int i;
flag = 1;
width = tupleCount (term);
i = 0;
while (i < width)
{
sum = sum + goal_add (tupleProject (term, i), run, ev, level);
if (i > 0)
{
Binding b;
b = (Binding) sys->bindings->data;
}
i++;
}
sum = sum +
goal_add (TermOp1 (term), run, ev, level) +
goal_add (TermOp2 (term), run, ev, level);
}
else
{
@ -516,6 +504,10 @@ goal_remove_last (int n)
int
goal_bind (const Binding b, const int run, const int ev)
{
if (b->blocked)
{
error ("Trying to bind a blocked goal.");
}
if (!b->done)
{
#ifdef DEBUG
@ -525,7 +517,7 @@ goal_bind (const Binding b, const int run, const int ev)
b->done = 1;
b->run_from = run;
b->ev_from = ev;
goal_graph_create (b);
goal_graph_create ();
return warshall (graph, nodes);
}
else
@ -549,6 +541,37 @@ goal_unbind (const Binding b)
}
}
//! Bind a goal as a dummy (block)
/**
* Especially made for tuple expansion
*/
int binding_block (Binding b)
{
if (!b->blocked)
{
b->blocked = 1;
return 1;
}
else
{
error ("Trying to block a goal again.");
}
}
//! Unblock a binding
int binding_unblock (Binding b)
{
if (b->blocked)
{
b->blocked = 0;
return 1;
}
else
{
error ("Trying to unblock a non-blocked goal.");
}
}
//! Determine whether some label set is ordered w.r.t. send/read order.
/**
* Assumes all these labels exist in the system, within length etc, and that the run mappings are valid.
@ -606,6 +629,15 @@ labels_ordered (Termmap runs, Termlist labels)
return 1;
}
//! Check whether the binding denotes a sensible thing such that we can use run_from and ev_from
int valid_binding (Binding b)
{
if (b->done && !b->blocked)
return 1;
else
return 0;
}
//! Prune invalid state w.r.t. <=C minimal requirement
/**
* Intuition says this can be done a lot more efficient. Luckily this is the prototype.
@ -636,7 +668,8 @@ bindings_c_minimal ()
Binding b;
b = (Binding) bl->data;
if (b->done)
// Check for a valid binding; it has to be 'done' and sensibly bound (not as in tuple expanded stuff)
if (valid_binding(b))
{
int run;
int node_from;

View File

@ -11,6 +11,7 @@
struct binding
{
int done; //!< Iff true, it is bound
int blocked; //!< Iff true, ignore it
int run_from;
int ev_from;
@ -39,11 +40,14 @@ void goal_graph_create ();
int binding_print (Binding b);
int valid_binding (Binding b);
int goal_add (Term term, const int run, const int ev, const int level);
void goal_remove_last (int n);
int goal_bind (const Binding b, const int run, const int ev);
void goal_unbind (const Binding b);
int binding_block (Binding b);
int binding_unblock (Binding b);
int labels_ordered (Termmap runs, Termlist labels);
int bindings_c_minimal ();

View File

@ -57,7 +57,6 @@ Term TERM_Function;
Term TERM_Hidden;
Term TERM_Type;
Term TERM_Nonce;
Term TERM_Agent;
Term TERM_Claim;
Term CLAIM_Secret;

View File

@ -58,7 +58,36 @@ showSubst (Term t)
__inline__ int
goodsubst (Term tvar, Term tsubst)
{
if (tvar->stype == NULL || (mgu_match == 2))
// function to test compatibility
__inline__ int compatibleTypes ()
{
if (tvar->stype == NULL)
{
// If the variable type is unspecified, anything goes
return 1;
}
else
{
// There are variable types.
// At least one of them should match a type of the constant.
Termlist tl;
tl = tvar->stype;
while (tl != NULL)
{
if (inTermlist (tsubst->stype, tl->term))
{
// One type matches
return 1;
}
tl = tl->next;
}
// No matches
return 0;
}
}
if (mgu_match == 2)
{
return 1;
}
@ -76,7 +105,7 @@ goodsubst (Term tvar, Term tsubst)
{
// It's a leaf, but what type?
if (mgu_match == 1
|| termlistContained (tvar->stype, tsubst->stype))
|| compatibleTypes ())
{
return 1;
}

View File

@ -18,6 +18,7 @@
/* from compiler.o */
extern Term TERM_Type;
extern Term TERM_Agent;
//! Global flag that signals LaTeX output.
/**
@ -708,11 +709,17 @@ roleInstanceArachne (const System sys, const Protocol protocol,
// Flag this
newt->roleVar = 1;
newt->stype = termlistAddNew (newt->stype, TERM_Agent);
// maybe add choose?
// Note that for anything but full type flaws, this is not an issue.
// In the POR reduction, force choose was the default. Here it is not.
if (not_read_first (rd, oldt) && sys->match == 2)
/*
* [x]
* TODO currently disabled: something weird was goind on causing weird prunes,
* for match=2. Investigate later.
*/
if (0 && not_read_first (rd, oldt) && sys->match == 2)
{
/* this term is forced as a choose, or it does not occur in the (first) read event */
if (extterm == NULL)

View File

@ -26,7 +26,7 @@ struct term
int type;
//! Data Type termlist (e.g. agent or nonce)
/** Only for leaves. */
void *stype;
void *stype; // list of types
int roleVar; // only for leaf, arachne engine: role variable flag
//! Substitution term.