/** * By default, ta->tb will map. Returning 0 (false) will swap them. */ int preferSubstitutionOrder (Term ta, Term tb) { if (termlistLength (ta->stype) == 1 && inTermlist (ta->stype, TERM_Agent)) { /** * If the first one is an agent type, we prefer swapping. */ return 0; } // Per default, leave it as it is. return 1; }
//! Determine whether this is a leaf construct with a ticket in it int isTicketTerm (Term t) { if (t != NULL) { if (realTermLeaf (t)) { if (inTermlist (t->stype, TERM_Ticket)) { return true; } else { if (realTermVariable (t)) { return isTicketTerm (t->subst); } } } } return false; }
/** * Interesting case: role names are variables here, so they always match. We catch that case by inspecting the variable list. */ int checkRoletermMatch (const Term t1, const Term t2, const Termlist notmapped) { Termlist tl; // simple clause or combined tl = termMguTerm (t1, t2); if (tl == MGUFAIL) { return false; } else { int result; Termlist vl; result = true; // Reset variables termlistSubstReset (tl); // Check variable list etc: should not contain mapped role names vl = tl; while (vl != NULL) { // This term should not be in the notmapped list if (inTermlist (notmapped, vl->term)) { result = false; break; } vl = vl->next; } // Remove list termlistDelete (tl); return result; } }
//! Print a term in XML form (iteration inner) void xmlTermPrintInner (Term term) { if (term != NULL) { if (!show_substitution_path) { /* In a normal situation, variables are immediately substituted, and * only the result is output. */ term = deVar (term); } if (realTermLeaf (term)) { // Variable? if (realTermVariable (term)) { Term substbuffer; eprintf ("<var name=\""); if (term->subst == NULL) { // Free variable termPrint (term); // Must be a normal termPrint eprintf ("\" free=\"true\" />"); } else { // Bound variable substbuffer = term->subst; // Temporarily unsubst for printing term->subst = NULL; termPrint (term); // Must be a normal termPrint term->subst = substbuffer; eprintf ("\">"); xmlTermPrintInner (term->subst); eprintf ("</var>"); } } else { // Constant eprintf ("<const>"); termPrint (term); // Must be a normal termPrint eprintf ("</const>"); } } else { // Node if (realTermEncrypt (term)) { if (isTermLeaf (TermKey (term)) && inTermlist (TermKey (term)->stype, TERM_Function)) { /* function application */ eprintf ("<apply><function>"); xmlTermPrintInner (TermKey (term)); eprintf ("</function><arg>"); xmlTermPrintInner (TermOp (term)); eprintf ("</arg></apply>"); } else { eprintf ("<encrypt><op>"); xmlTermPrintInner (TermOp (term)); eprintf ("</op><key>"); xmlTermPrintInner (TermKey (term)); eprintf ("</key></encrypt>"); } } else { // Assume tuple eprintf ("<tuple><op1>"); xmlTermPrintInner (TermOp1 (term)); eprintf ("</op1><op2>"); xmlTermPrintInner (TermOp2 (term)); eprintf ("</op2></tuple>"); } } } }