Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 583ffa4ba069126c3ba0bc565dc0485a > files > 793

cvc3-doc-2.4.1-1.fc15.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>CVC3: cnf_manager.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">CVC3&#160;<span id="projectnumber">2.4.1</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">cnf_manager.cpp</div>  </div>
</div>
<div class="contents">
<a href="cnf__manager_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*****************************************************************************/</span><span class="comment"></span>
<a name="l00002"></a>00002 <span class="comment">/*!</span>
<a name="l00003"></a>00003 <span class="comment"> *\file cnf_manager.cpp</span>
<a name="l00004"></a>00004 <span class="comment"> *\brief Implementation of CNF_Manager</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * Author: Clark Barrett</span>
<a name="l00007"></a>00007 <span class="comment"> *</span>
<a name="l00008"></a>00008 <span class="comment"> * Created: Thu Jan  5 02:30:02 2006</span>
<a name="l00009"></a>00009 <span class="comment"> *</span>
<a name="l00010"></a>00010 <span class="comment"> * &lt;hr&gt;</span>
<a name="l00011"></a>00011 <span class="comment"> *</span>
<a name="l00012"></a>00012 <span class="comment"> * License to use, copy, modify, sell and/or distribute this software</span>
<a name="l00013"></a>00013 <span class="comment"> * and its documentation for any purpose is hereby granted without</span>
<a name="l00014"></a>00014 <span class="comment"> * royalty, subject to the terms and conditions defined in the \ref</span>
<a name="l00015"></a>00015 <span class="comment"> * LICENSE file provided with this distribution.</span>
<a name="l00016"></a>00016 <span class="comment"> * </span>
<a name="l00017"></a>00017 <span class="comment"> * &lt;hr&gt;</span>
<a name="l00018"></a>00018 <span class="comment"> */</span>
<a name="l00019"></a>00019 <span class="comment">/*****************************************************************************/</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 
<a name="l00022"></a>00022 <span class="preprocessor">#include &quot;<a class="code" href="cnf__manager_8h.html" title="Manager for conversion to and traversal of CNF formulas.">cnf_manager.h</a>&quot;</span>
<a name="l00023"></a>00023 <span class="preprocessor">#include &quot;<a class="code" href="cnf__rules_8h.html" title="Abstract proof rules for CNF conversion.">cnf_rules.h</a>&quot;</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &quot;<a class="code" href="common__proof__rules_8h.html">common_proof_rules.h</a>&quot;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;<a class="code" href="theorem__manager_8h.html">theorem_manager.h</a>&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &quot;<a class="code" href="vc_8h.html" title="Generic API for a validity checker.">vc.h</a>&quot;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &quot;<a class="code" href="command__line__flags_8h.html">command_line_flags.h</a>&quot;</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 
<a name="l00030"></a>00030 <span class="keyword">using namespace </span>std;
<a name="l00031"></a>00031 <span class="keyword">using namespace </span>CVC3;
<a name="l00032"></a>00032 <span class="keyword">using namespace </span>SAT;
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 
<a name="l00035"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a7bb76ec26a37645bd0183715af69966f">00035</a> CNF_Manager::CNF_Manager(<a class="code" href="classCVC3_1_1TheoremManager.html">TheoremManager</a>* tm, <a class="code" href="classCVC3_1_1Statistics.html">Statistics</a>&amp; statistics,
<a name="l00036"></a>00036                          <span class="keyword">const</span> <a class="code" href="classCVC3_1_1CLFlags.html">CLFlags</a>&amp; flags)
<a name="l00037"></a>00037   : d_vc(NULL),
<a name="l00038"></a>00038     d_commonRules(tm-&gt;getRules()),
<a name="l00039"></a>00039     <span class="comment">//    d_theorems(tm-&gt;getCM()-&gt;getCurrentContext()),</span>
<a name="l00040"></a>00040     d_clauseIdNext(0),
<a name="l00041"></a>00041     <span class="comment">//    d_translated(tm-&gt;getCM()-&gt;getCurrentContext()),</span>
<a name="l00042"></a>00042     d_bottomScope(-1),
<a name="l00043"></a>00043     d_statistics(statistics),
<a name="l00044"></a>00044     d_flags(flags),
<a name="l00045"></a>00045     d_nullExpr(tm-&gt;getEM()-&gt;getNullExpr()),
<a name="l00046"></a>00046     d_cnfCallback(NULL)
<a name="l00047"></a>00047 {
<a name="l00048"></a>00048   <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a> = <a class="code" href="classSAT_1_1CNF__Manager.html#a4caaeae8fffbb938e8b723c0b0cfe98e">createProofRules</a>(tm, flags);
<a name="l00049"></a>00049   <span class="comment">// Push dummy varinfo onto d_varInfo since Var&#39;s are indexed from 1 not 0</span>
<a name="l00050"></a>00050   <a class="code" href="structSAT_1_1CNF__Manager_1_1Varinfo.html" title="Information kept for each CNF variable.">Varinfo</a> v;
<a name="l00051"></a>00051   <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.push_back(v);
<a name="l00052"></a>00052   <span class="keywordflow">if</span> (flags[<span class="stringliteral">&quot;minimizeClauses&quot;</span>].getBool()) {
<a name="l00053"></a>00053     <a class="code" href="classCVC3_1_1CLFlags.html">CLFlags</a> flags = ValidityChecker::createFlags();
<a name="l00054"></a>00054     flags.<a class="code" href="classCVC3_1_1CLFlags.html#a20dee56b9b946d73421253eb99e434e3">setFlag</a>(<span class="stringliteral">&quot;minimizeClauses&quot;</span>,<span class="keyword">false</span>);
<a name="l00055"></a>00055     <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a> = ValidityChecker::create(flags);
<a name="l00056"></a>00056   }
<a name="l00057"></a>00057 }
<a name="l00058"></a>00058 
<a name="l00059"></a>00059 
<a name="l00060"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a14a7c3223d238a6d9d0864692c450774">00060</a> <a class="code" href="classSAT_1_1CNF__Manager.html#a14a7c3223d238a6d9d0864692c450774">CNF_Manager::~CNF_Manager</a>()
<a name="l00061"></a>00061 {
<a name="l00062"></a>00062   <span class="keywordflow">if</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>) <span class="keyword">delete</span> <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>;
<a name="l00063"></a>00063   <span class="keyword">delete</span> <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>;
<a name="l00064"></a>00064 }
<a name="l00065"></a>00065 
<a name="l00066"></a>00066 
<a name="l00067"></a><a class="code" href="classSAT_1_1CNF__Manager.html#aad4c1fe260c5c15d94a4010d82569e74">00067</a> <span class="keywordtype">void</span> <a class="code" href="classSAT_1_1CNF__Manager.html#aad4c1fe260c5c15d94a4010d82569e74" title="Register a new atomic formula.">CNF_Manager::registerAtom</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>&amp; e, <span class="keyword">const</span> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a>&amp; thm)
<a name="l00068"></a>00068 {
<a name="l00069"></a>00069   <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!e.<a class="code" href="group__ExprPkg.html#ga8b55ff94d7f47d1166350cf308f2dd09">isRegisteredAtom</a>() || e.<a class="code" href="group__ExprPkg.html#ga8296386eb481a436937b6f0b140f8af0">isUserRegisteredAtom</a>(), <span class="stringliteral">&quot;Atom already registered&quot;</span>);
<a name="l00070"></a>00070   <span class="keywordflow">if</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#a81c6d45a1864f4266197e90de4649c14" title="Instance of CNF_CallBack: must be registered.">d_cnfCallback</a> &amp;&amp; !e.<a class="code" href="group__ExprPkg.html#ga8b55ff94d7f47d1166350cf308f2dd09">isRegisteredAtom</a>()) <a class="code" href="classSAT_1_1CNF__Manager.html#a81c6d45a1864f4266197e90de4649c14" title="Instance of CNF_CallBack: must be registered.">d_cnfCallback</a>-&gt;<a class="code" href="classSAT_1_1CNF__Manager_1_1CNFCallback.html#a5bfb2992c14e9a7a1c824f1df49aa8b3" title="Register an atom.">registerAtom</a>(e, thm);
<a name="l00071"></a>00071 }
<a name="l00072"></a>00072 
<a name="l00073"></a>00073 
<a name="l00074"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a9c44bb0556800d1f05eca51d68a73e67">00074</a> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> <a class="code" href="classSAT_1_1CNF__Manager.html#a9c44bb0556800d1f05eca51d68a73e67" title="Recursively traverse an expression with an embedded term ITE.">CNF_Manager::replaceITErec</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>&amp; e, <a class="code" href="classSAT_1_1Var.html">Var</a> v, <span class="keywordtype">bool</span> translateOnly)
<a name="l00075"></a>00075 {
<a name="l00076"></a>00076   <span class="comment">// Quick exit for atomic expressions</span>
<a name="l00077"></a>00077   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga48a9219339b394280550069ac7b0474f" title="Test if e is atomic.">isAtomic</a>()) <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(e);
<a name="l00078"></a>00078 
<a name="l00079"></a>00079   <span class="comment">// Check cache</span>
<a name="l00080"></a>00080   <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> thm;
<a name="l00081"></a>00081   <span class="keywordtype">bool</span> foundInCache = <span class="keyword">false</span>;
<a name="l00082"></a>00082   <a class="code" href="classCVC3_1_1ExprHashMap.html">ExprHashMap&lt;Theorem&gt;::iterator</a> iMap = <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#aeffd58f05fbeb8f381ba2050adef7a2d">find</a>(e);
<a name="l00083"></a>00083   <span class="keywordflow">if</span> (iMap != <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#a0ea2aa250fd1431c311d83f32862bba7">end</a>()) {
<a name="l00084"></a>00084     thm = (*iMap).second;
<a name="l00085"></a>00085     foundInCache = <span class="keyword">true</span>;
<a name="l00086"></a>00086   }
<a name="l00087"></a>00087 
<a name="l00088"></a>00088   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga7814e4f55f65c7ca860c637413df5f4d">getKind</a>() == <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba3a4cfaf3eae8eac1dc2fd27d9f0994dc">ITE</a>) {
<a name="l00089"></a>00089     <span class="comment">// Replace non-Bool ITE expressions</span>
<a name="l00090"></a>00090     <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!e.<a class="code" href="group__ExprPkg.html#ga42929221eb172250697b72c28af6de07" title="Get the type. Recursively compute if necessary.">getType</a>().<a class="code" href="classCVC3_1_1Type.html#a38bba404056eadf3c283a67ab2347e02">isBool</a>(), <span class="stringliteral">&quot;Expected non-Bool ITE&quot;</span>);
<a name="l00091"></a>00091     <span class="comment">// generate e = x for new x</span>
<a name="l00092"></a>00092     <span class="keywordflow">if</span> (!foundInCache) thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a10fa187373ec24079c10874d8e804ecb" title="Retrun a theorem &quot;|- e = v&quot; for a new Skolem constant v.">varIntroSkolem</a>(e);
<a name="l00093"></a>00093     <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> thm2 = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a0a87e88508f49b73037e0024afa841bf" title=" (same for IFF)">symmetryRule</a>(thm);
<a name="l00094"></a>00094     thm2 = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#aebbcd4a194e4fdca0bcd16143fb03a75">iffMP</a>(thm2, <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga941f65f9beb6d3233a6d628c83731960" title="|- P(_, ITE(cond,a,b), _) &lt;=&gt; ITE(cond,Pred(_, a, _),Pred(_, b, _))">ifLiftRule</a>(thm2.<a class="code" href="classCVC3_1_1Theorem.html#af2b97ae5d270ddf1013bf4f3867a7e5d">getExpr</a>(), 1));
<a name="l00095"></a>00095     <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.push_back(v);
<a name="l00096"></a>00096     <a class="code" href="classSAT_1_1CNF__Manager.html#a5ef71065232a1ffbdce52398b1faafc4" title="Queue of theorems to translate.">d_translateQueueThms</a>.push_back(thm2);
<a name="l00097"></a>00097     <a class="code" href="classSAT_1_1CNF__Manager.html#ae23cfc40d069a750c70dd4ed99a18564" title="Whether thm to translate is &quot;translate only&quot;.">d_translateQueueFlags</a>.push_back(translateOnly);
<a name="l00098"></a>00098   }
<a name="l00099"></a>00099   <span class="keywordflow">else</span> {
<a name="l00100"></a>00100     <span class="comment">// Recursively traverse, replacing ITE&#39;s</span>
<a name="l00101"></a>00101     vector&lt;Theorem&gt; thms;
<a name="l00102"></a>00102     vector&lt;unsigned&gt; changed;
<a name="l00103"></a>00103     <span class="keywordtype">unsigned</span> index = 0;
<a name="l00104"></a>00104     <a class="code" href="classCVC3_1_1Expr_1_1iterator.html">Expr::iterator</a> i, iend;
<a name="l00105"></a>00105     <span class="keywordflow">if</span> (foundInCache) {
<a name="l00106"></a>00106       <span class="keywordflow">for</span>(i = e.<a class="code" href="group__ExprPkg.html#gac890e13db184610276fc533fa4b4fe99" title="Begin iterator.">begin</a>(), iend = e.<a class="code" href="group__ExprPkg.html#gaf6048a5030c8fa2511bf5dfee868e653" title="End iterator.">end</a>(); i!=iend; ++i, ++index) {
<a name="l00107"></a>00107         <a class="code" href="classSAT_1_1CNF__Manager.html#a9c44bb0556800d1f05eca51d68a73e67" title="Recursively traverse an expression with an embedded term ITE.">replaceITErec</a>(*i, v, translateOnly);
<a name="l00108"></a>00108       }
<a name="l00109"></a>00109     }
<a name="l00110"></a>00110     <span class="keywordflow">else</span> {
<a name="l00111"></a>00111       <span class="keywordflow">for</span>(i = e.<a class="code" href="group__ExprPkg.html#gac890e13db184610276fc533fa4b4fe99" title="Begin iterator.">begin</a>(), iend = e.<a class="code" href="group__ExprPkg.html#gaf6048a5030c8fa2511bf5dfee868e653" title="End iterator.">end</a>(); i!=iend; ++i, ++index) {
<a name="l00112"></a>00112         thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a9c44bb0556800d1f05eca51d68a73e67" title="Recursively traverse an expression with an embedded term ITE.">replaceITErec</a>(*i, v, translateOnly);
<a name="l00113"></a>00113         <span class="keywordflow">if</span> (!thm.<a class="code" href="classCVC3_1_1Theorem.html#a16f074e60b9e076187efb478889d2c47">isRefl</a>()) {
<a name="l00114"></a>00114           thms.push_back(thm);
<a name="l00115"></a>00115           changed.push_back(index);
<a name="l00116"></a>00116         }
<a name="l00117"></a>00117       }
<a name="l00118"></a>00118       <span class="keywordflow">if</span>(changed.size() &gt; 0) {
<a name="l00119"></a>00119         thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a776c827bb6e3b889234429c49ae9ad6f" title="Optimized case for expr with one child.">substitutivityRule</a>(e, changed, thms);
<a name="l00120"></a>00120       }
<a name="l00121"></a>00121       <span class="keywordflow">else</span> thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(e);
<a name="l00122"></a>00122     }
<a name="l00123"></a>00123   }
<a name="l00124"></a>00124 
<a name="l00125"></a>00125   <span class="comment">// Update cache and return</span>
<a name="l00126"></a>00126   <span class="keywordflow">if</span> (!foundInCache) <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>[e] = thm;
<a name="l00127"></a>00127   <span class="keywordflow">return</span> thm;
<a name="l00128"></a>00128 }
<a name="l00129"></a>00129 
<a name="l00130"></a>00130 
<a name="l00131"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551">00131</a> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">CNF_Manager::concreteExpr</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">CVC3::Expr</a>&amp; e, <span class="keyword">const</span> <a class="code" href="classSAT_1_1Lit.html">Lit</a>&amp; literal){
<a name="l00132"></a>00132   <span class="keywordflow">if</span> ( e.<a class="code" href="group__ExprPkg.html#gadf8596df73fa69ff8e6a22b9321f5c34">isTrue</a>() || e.<a class="code" href="group__ExprPkg.html#ga6173f64b22cba76472cd0c814bbf6dae">isFalse</a>() || 
<a name="l00133"></a>00133        (e.<a class="code" href="group__ExprPkg.html#ga1a898858ccadce833df5a294c7740f11">isNot</a>() &amp;&amp; (e[0].<a class="code" href="group__ExprPkg.html#gadf8596df73fa69ff8e6a22b9321f5c34">isTrue</a>() || e[0].<a class="code" href="group__ExprPkg.html#ga6173f64b22cba76472cd0c814bbf6dae">isFalse</a>()))) 
<a name="l00134"></a>00134     <span class="keywordflow">return</span> e;
<a name="l00135"></a>00135   <span class="keywordflow">else</span> 
<a name="l00136"></a>00136     <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1CNF__Manager.html#a42c3cbd432324757f09ffd622ab1f057" title="Convert a CNF literal to an Expr literal.">concreteLit</a>(literal);
<a name="l00137"></a>00137 }
<a name="l00138"></a>00138 
<a name="l00139"></a><a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935">00139</a> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> <a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">CNF_Manager::concreteThm</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">CVC3::Expr</a>&amp; ine){
<a name="l00140"></a>00140   <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> ret = <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>[ine];
<a name="l00141"></a>00141   <span class="keywordflow">if</span> (ret.<a class="code" href="classCVC3_1_1Theorem.html#afc6fdb0507eb3669e28d9be5ed0bd333">isNull</a>()) {
<a name="l00142"></a>00142     ret  = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(ine);
<a name="l00143"></a>00143   }
<a name="l00144"></a>00144   <span class="keywordflow">return</span> ret;
<a name="l00145"></a>00145 }
<a name="l00146"></a>00146 
<a name="l00147"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4">00147</a> <a class="code" href="classSAT_1_1Lit.html">Lit</a> <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">CNF_Manager::translateExprRec</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>&amp; e, <a class="code" href="classSAT_1_1CNF__Formula.html">CNF_Formula</a>&amp; cnf, <span class="keyword">const</span> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a>&amp; thmIn)
<a name="l00148"></a>00148 {
<a name="l00149"></a>00149   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga6173f64b22cba76472cd0c814bbf6dae">isFalse</a>()) <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html#af31c280c018065d2c1232a2cb8503fa7">Lit::getFalse</a>();
<a name="l00150"></a>00150   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#gadf8596df73fa69ff8e6a22b9321f5c34">isTrue</a>()) <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html#ae639d83f877c976508d280a25c54e12b">Lit::getTrue</a>();
<a name="l00151"></a>00151   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga1a898858ccadce833df5a294c7740f11">isNot</a>()) <span class="keywordflow">return</span> !<a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thmIn);
<a name="l00152"></a>00152 
<a name="l00153"></a>00153   <a class="code" href="classCVC3_1_1ExprHashMap.html">ExprHashMap&lt;Var&gt;::iterator</a> iMap = <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#aeffd58f05fbeb8f381ba2050adef7a2d">find</a>(e);
<a name="l00154"></a>00154 
<a name="l00155"></a>00155   <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#gabe0b99a2c155f75ceedd4f06263ddebb">isTranslated</a>()) {
<a name="l00156"></a>00156     <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(iMap != <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#a0ea2aa250fd1431c311d83f32862bba7">end</a>(), <span class="stringliteral">&quot;Translated expr should be in map&quot;</span>);
<a name="l00157"></a>00157     <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html">Lit</a>((*iMap).second);
<a name="l00158"></a>00158   }
<a name="l00159"></a>00159   <span class="keywordflow">else</span> e.<a class="code" href="group__ExprPkg.html#gaf941ebb5b9a8e6ee0ca004d59425fb42" title="Set the translated flag for this Expr.">setTranslated</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a60a763224b0c38233c65bfa1374f6ab0" title="Whether expr has already been translated.">d_bottomScope</a>);
<a name="l00160"></a>00160 
<a name="l00161"></a>00161   <a class="code" href="classSAT_1_1Var.html">Var</a> v(<span class="keywordtype">int</span>(<a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.size()));
<a name="l00162"></a>00162   <span class="keywordtype">bool</span> translateOnly = <span class="keyword">false</span>;
<a name="l00163"></a>00163 
<a name="l00164"></a>00164   <span class="keywordflow">if</span> (iMap != <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#a0ea2aa250fd1431c311d83f32862bba7">end</a>()) {
<a name="l00165"></a>00165     v = (*iMap).second;
<a name="l00166"></a>00166     translateOnly = <span class="keyword">true</span>;
<a name="l00167"></a>00167     <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[v].fanouts.clear();
<a name="l00168"></a>00168   }
<a name="l00169"></a>00169   <span class="keywordflow">else</span> {
<a name="l00170"></a>00170     <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.resize(v+1);
<a name="l00171"></a>00171     <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.back().expr = e;
<a name="l00172"></a>00172     <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e] = v;
<a name="l00173"></a>00173   }
<a name="l00174"></a>00174 
<a name="l00175"></a>00175   <a class="code" href="classCVC3_1_1Expr_1_1iterator.html">Expr::iterator</a> i, iend;
<a name="l00176"></a>00176   <span class="keywordtype">bool</span> isAnd = <span class="keyword">false</span>;
<a name="l00177"></a>00177   <span class="keywordflow">switch</span> (e.<a class="code" href="group__ExprPkg.html#ga7814e4f55f65c7ca860c637413df5f4d">getKind</a>()) {
<a name="l00178"></a>00178     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba865555c9f2e0458a7078486aa1b3254f">AND</a>:
<a name="l00179"></a>00179       isAnd = <span class="keyword">true</span>;
<a name="l00180"></a>00180     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba96727447c0ad447987df1c6415aef074">OR</a>: {
<a name="l00181"></a>00181       
<a name="l00182"></a>00182       vector&lt;Lit&gt; lits;
<a name="l00183"></a>00183       <span class="keywordtype">unsigned</span> idx;
<a name="l00184"></a>00184       <span class="keywordflow">for</span> (i = e.<a class="code" href="group__ExprPkg.html#gac890e13db184610276fc533fa4b4fe99" title="Begin iterator.">begin</a>(), iend = e.<a class="code" href="group__ExprPkg.html#gaf6048a5030c8fa2511bf5dfee868e653" title="End iterator.">end</a>(); i != iend; ++i) {
<a name="l00185"></a>00185         lits.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(*i, cnf, thmIn));
<a name="l00186"></a>00186       }
<a name="l00187"></a>00187 
<a name="l00188"></a>00188       vector&lt;Expr&gt; new_chls;
<a name="l00189"></a>00189       vector&lt;Theorem&gt; thms;
<a name="l00190"></a>00190       <span class="keywordflow">for</span> (idx = 0; idx &lt; lits.size(); ++idx) {
<a name="l00191"></a>00191   new_chls.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[idx],lits[idx]));
<a name="l00192"></a>00192   thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[idx]));
<a name="l00193"></a>00193       }
<a name="l00194"></a>00194       
<a name="l00195"></a>00195       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> after = (isAnd ? <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>(<a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba865555c9f2e0458a7078486aa1b3254f">AND</a>,new_chls) : Expr(<a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba96727447c0ad447987df1c6415aef074">OR</a>,new_chls)) ;    
<a name="l00196"></a>00196 
<a name="l00197"></a>00197       <span class="comment">//      DebugAssert(concreteExpr(e,Lit(v)) == e,&quot;why here&quot;);</span>
<a name="l00198"></a>00198 
<a name="l00199"></a>00199       <span class="keywordflow">for</span> (idx = 0; idx &lt; lits.size(); ++idx) {
<a name="l00200"></a>00200         cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00201"></a>00201         cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),isAnd);
<a name="l00202"></a>00202         cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(lits[idx], !isAnd);
<a name="l00203"></a>00203   
<a name="l00204"></a>00204   <span class="comment">//  DebugAssert(concreteExpr(e[idx],lits[idx]) == e[idx], &quot;why here&quot;);</span>
<a name="l00205"></a>00205 
<a name="l00206"></a>00206   std::string reasonStr = (isAnd ? <span class="stringliteral">&quot;and_mid&quot;</span> : <span class="stringliteral">&quot;or_mid&quot;</span>);
<a name="l00207"></a>00207 
<a name="l00208"></a>00208   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, reasonStr, idx,thms)); <span class="comment">// by yeting</span>
<a name="l00209"></a>00209       }
<a name="l00210"></a>00210 
<a name="l00211"></a>00211       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00212"></a>00212       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),!isAnd);
<a name="l00213"></a>00213       <span class="keywordflow">for</span> (idx = 0; idx &lt; lits.size(); ++idx) {
<a name="l00214"></a>00214         cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(lits[idx], isAnd);
<a name="l00215"></a>00215       }
<a name="l00216"></a>00216 
<a name="l00217"></a>00217       std::string reasonStr = (isAnd ? <span class="stringliteral">&quot;and_final&quot;</span> : <span class="stringliteral">&quot;or_final&quot;</span>) ;   
<a name="l00218"></a>00218       
<a name="l00219"></a>00219       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, reasonStr, 0, thms)); <span class="comment">// by yeting</span>
<a name="l00220"></a>00220       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00221"></a>00221       <span class="keywordflow">break</span>;
<a name="l00222"></a>00222     }
<a name="l00223"></a>00223     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba7338bb59b9aa936104a6d2f631d4d8db">IMPLIES</a>: {
<a name="l00224"></a>00224       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg0 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thmIn);
<a name="l00225"></a>00225       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg1 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[1], cnf, thmIn);
<a name="l00226"></a>00226 
<a name="l00227"></a>00227       vector&lt;Theorem&gt; thms;
<a name="l00228"></a>00228       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[0]));
<a name="l00229"></a>00229       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[1]));
<a name="l00230"></a>00230 
<a name="l00231"></a>00231       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#ad93cb56673487974071ed3b75bf4ea83">left</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[0],arg0));
<a name="l00232"></a>00232       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#a82558b7a36c52f5d3211d5d14bed99d4">right</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[1],arg1));
<a name="l00233"></a>00233       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> after = left.<a class="code" href="group__ExprPkg.html#ga8dd97bcdeb9d8870238f94a263fd083b">impExpr</a>(right);
<a name="l00234"></a>00234 
<a name="l00235"></a>00235 
<a name="l00236"></a>00236       <span class="comment">//      DebugAssert(concreteExpr(e, Lit(v)) == e, &quot;why here&quot;);</span>
<a name="l00237"></a>00237       <span class="comment">//      DebugAssert(concreteExpr(e[0], arg0) == e[0], &quot;why here&quot;);</span>
<a name="l00238"></a>00238       <span class="comment">//      DebugAssert(concreteExpr(e[1], arg1) == e[1], &quot;why here&quot;);</span>
<a name="l00239"></a>00239 
<a name="l00240"></a>00240       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00241"></a>00241       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00242"></a>00242       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00243"></a>00243 
<a name="l00244"></a>00244       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>( <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;imp&quot;</span>, 0,thms)); <span class="comment">// by yeting</span>
<a name="l00245"></a>00245 
<a name="l00246"></a>00246       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00247"></a>00247       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00248"></a>00248       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00249"></a>00249 
<a name="l00250"></a>00250       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>( <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;imp&quot;</span>, 1, thms)); <span class="comment">// by yeting</span>
<a name="l00251"></a>00251 
<a name="l00252"></a>00252       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00253"></a>00253       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00254"></a>00254       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00255"></a>00255       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00256"></a>00256 
<a name="l00257"></a>00257       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>( <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;imp&quot;</span>, 2,thms)); <span class="comment">// by yeting</span>
<a name="l00258"></a>00258       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00259"></a>00259       <span class="keywordflow">break</span>;
<a name="l00260"></a>00260     }
<a name="l00261"></a>00261     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba527cb185631442655c4486d51522b5a7">IFF</a>: {
<a name="l00262"></a>00262       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg0 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thmIn);
<a name="l00263"></a>00263       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg1 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[1], cnf, thmIn);
<a name="l00264"></a>00264 
<a name="l00265"></a>00265       <span class="comment">//      DebugAssert(concreteExpr(e, Lit(v)) == e, &quot;why here&quot;);</span>
<a name="l00266"></a>00266       <span class="comment">//      DebugAssert(concreteExpr(e[0], arg0) == e[0], &quot;why here&quot;);</span>
<a name="l00267"></a>00267       <span class="comment">//      DebugAssert(concreteExpr(e[1], arg1) == e[1], &quot;why here&quot;);</span>
<a name="l00268"></a>00268       vector&lt;Theorem&gt; thms;
<a name="l00269"></a>00269       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[0]));
<a name="l00270"></a>00270       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[1]));
<a name="l00271"></a>00271 
<a name="l00272"></a>00272       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#ad93cb56673487974071ed3b75bf4ea83">left</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[0],arg0));
<a name="l00273"></a>00273       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#a82558b7a36c52f5d3211d5d14bed99d4">right</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[1],arg1));
<a name="l00274"></a>00274       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> after = left.<a class="code" href="group__ExprPkg.html#gaae017ca8e68af655ba285c985dd9fba5">iffExpr</a>(right);
<a name="l00275"></a>00275 
<a name="l00276"></a>00276 
<a name="l00277"></a>00277       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00278"></a>00278       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00279"></a>00279       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00280"></a>00280       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00281"></a>00281 
<a name="l00282"></a>00282       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;iff&quot;</span>, 0, thms)); <span class="comment">// by yeting</span>
<a name="l00283"></a>00283 
<a name="l00284"></a>00284       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00285"></a>00285       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00286"></a>00286       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00287"></a>00287       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00288"></a>00288 
<a name="l00289"></a>00289       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;iff&quot;</span>, 1, thms)); <span class="comment">// by yeting</span>
<a name="l00290"></a>00290 
<a name="l00291"></a>00291       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00292"></a>00292       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00293"></a>00293       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00294"></a>00294       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00295"></a>00295 
<a name="l00296"></a>00296       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;iff&quot;</span>, 2, thms)); <span class="comment">// by yeting</span>
<a name="l00297"></a>00297 
<a name="l00298"></a>00298       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00299"></a>00299       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00300"></a>00300       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00301"></a>00301       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00302"></a>00302 
<a name="l00303"></a>00303       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;iff&quot;</span>, 3, thms)); <span class="comment">// by yeting</span>
<a name="l00304"></a>00304       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00305"></a>00305       <span class="keywordflow">break</span>;
<a name="l00306"></a>00306     }
<a name="l00307"></a>00307     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5bac62338ffb5de22369c75caa565b5da1a">XOR</a>: {
<a name="l00308"></a>00308 
<a name="l00309"></a>00309       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg0 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thmIn);
<a name="l00310"></a>00310       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg1 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[1], cnf, thmIn);
<a name="l00311"></a>00311 
<a name="l00312"></a>00312       <span class="comment">//      DebugAssert(concreteExpr(e, Lit(v)) == e, &quot;why here&quot;);</span>
<a name="l00313"></a>00313       <span class="comment">//      DebugAssert(concreteExpr(e[0], arg0) == e[0], &quot;why here&quot;);</span>
<a name="l00314"></a>00314       <span class="comment">//      DebugAssert(concreteExpr(e[1], arg1) == e[1], &quot;why here&quot;);</span>
<a name="l00315"></a>00315 
<a name="l00316"></a>00316       vector&lt;Theorem&gt; thms;
<a name="l00317"></a>00317       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[0]));
<a name="l00318"></a>00318       thms.push_back(<a class="code" href="classSAT_1_1CNF__Manager.html#acc9e77affcd72a13f95e7f68ed944935" title="Return the theorem if e is not as concreteExpr(e).">concreteThm</a>(e[1]));
<a name="l00319"></a>00319 
<a name="l00320"></a>00320       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#ad93cb56673487974071ed3b75bf4ea83">left</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[0],arg0));
<a name="l00321"></a>00321       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> <a class="code" href="namespaceMiniSat.html#a82558b7a36c52f5d3211d5d14bed99d4">right</a> = (<a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[1],arg1));
<a name="l00322"></a>00322       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> after = left.<a class="code" href="group__ExprPkg.html#ga37b3161a078f8992b71518992ab0b088">xorExpr</a>(right);
<a name="l00323"></a>00323 
<a name="l00324"></a>00324 
<a name="l00325"></a>00325       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00326"></a>00326       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00327"></a>00327       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00328"></a>00328       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00329"></a>00329 
<a name="l00330"></a>00330       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;xor&quot;</span>, 0, thms)); <span class="comment">// by yeting</span>
<a name="l00331"></a>00331 
<a name="l00332"></a>00332       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00333"></a>00333       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00334"></a>00334       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00335"></a>00335       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00336"></a>00336 
<a name="l00337"></a>00337       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;xor&quot;</span>, 1, thms)); <span class="comment">// by yeting</span>
<a name="l00338"></a>00338 
<a name="l00339"></a>00339       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00340"></a>00340       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00341"></a>00341       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00342"></a>00342       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00343"></a>00343 
<a name="l00344"></a>00344       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;xor&quot;</span>, 2, thms)); <span class="comment">// by yeting</span>
<a name="l00345"></a>00345 
<a name="l00346"></a>00346       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00347"></a>00347       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00348"></a>00348       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00349"></a>00349       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00350"></a>00350 
<a name="l00351"></a>00351       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gae66dc0ceb7b55eeeea57187e0acd4bd5">CNFtranslate</a>(e, after, <span class="stringliteral">&quot;xor&quot;</span>, 3,thms)); <span class="comment">// by yeting</span>
<a name="l00352"></a>00352       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00353"></a>00353       <span class="keywordflow">break</span>;
<a name="l00354"></a>00354     }
<a name="l00355"></a>00355     <span class="keywordflow">case</span> <a class="code" href="kinds_8h.html#aa10c9e8951b8ccf714a59ec321bdac5ba3a4cfaf3eae8eac1dc2fd27d9f0994dc">ITE</a>:
<a name="l00356"></a>00356     {
<a name="l00357"></a>00357 
<a name="l00358"></a>00358       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg0 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thmIn);
<a name="l00359"></a>00359       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg1 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[1], cnf, thmIn);
<a name="l00360"></a>00360       <a class="code" href="classSAT_1_1Lit.html">Lit</a> arg2 = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[2], cnf, thmIn);
<a name="l00361"></a>00361 
<a name="l00362"></a>00362 
<a name="l00363"></a>00363       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> aftere0 = <a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[0], arg0);
<a name="l00364"></a>00364       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> aftere1 = <a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[1], arg1);
<a name="l00365"></a>00365       <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> aftere2 = <a class="code" href="classSAT_1_1CNF__Manager.html#a41ad958fb86a4da62890caf922250551" title="Return the expr corresponding to the literal unless the expr is TRUE of FALSE.">concreteExpr</a>(e[2], arg2);
<a name="l00366"></a>00366       
<a name="l00367"></a>00367       vector&lt;Expr&gt; after ;
<a name="l00368"></a>00368       after.push_back(aftere0);
<a name="l00369"></a>00369       after.push_back(aftere1);
<a name="l00370"></a>00370       after.push_back(aftere2);
<a name="l00371"></a>00371       
<a name="l00372"></a>00372       <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> e0thm;
<a name="l00373"></a>00373       <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> e1thm;
<a name="l00374"></a>00374       <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> e2thm;
<a name="l00375"></a>00375 
<a name="l00376"></a>00376       { e0thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>[e[0]];
<a name="l00377"></a>00377   <span class="keywordflow">if</span> (e0thm.<a class="code" href="classCVC3_1_1Theorem.html#afc6fdb0507eb3669e28d9be5ed0bd333">isNull</a>()) e0thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(e[0]);
<a name="l00378"></a>00378   e1thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>[e[1]];
<a name="l00379"></a>00379   <span class="keywordflow">if</span> (e1thm.<a class="code" href="classCVC3_1_1Theorem.html#afc6fdb0507eb3669e28d9be5ed0bd333">isNull</a>()) e1thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(e[1]);
<a name="l00380"></a>00380   e2thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a29c5c9b3c09bb443e806ed51bd78d3b5" title="Cached translation of term-ite-containing expressions.">d_iteMap</a>[e[2]];
<a name="l00381"></a>00381   <span class="keywordflow">if</span> (e2thm.<a class="code" href="classCVC3_1_1Theorem.html#afc6fdb0507eb3669e28d9be5ed0bd333">isNull</a>()) e2thm = <a class="code" href="classSAT_1_1CNF__Manager.html#aff2bf1721ef06059d56936a62fc2b82e" title="Common proof rules.">d_commonRules</a>-&gt;<a class="code" href="classCVC3_1_1CommonProofRules.html#a61c1fe56b4ed9744006883a7784ddb71">reflexivityRule</a>(e[2]);
<a name="l00382"></a>00382       }
<a name="l00383"></a>00383 
<a name="l00384"></a>00384       vector&lt;Theorem&gt; thms ;
<a name="l00385"></a>00385       thms.push_back(e0thm);
<a name="l00386"></a>00386       thms.push_back(e1thm);      
<a name="l00387"></a>00387       thms.push_back(e2thm);
<a name="l00388"></a>00388 
<a name="l00389"></a>00389  
<a name="l00390"></a>00390 
<a name="l00391"></a>00391       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00392"></a>00392       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00393"></a>00393       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00394"></a>00394       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg2);
<a name="l00395"></a>00395       
<a name="l00396"></a>00396       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 1)); <span class="comment">// by yeting</span>
<a name="l00397"></a>00397 
<a name="l00398"></a>00398       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00399"></a>00399       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00400"></a>00400       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0);
<a name="l00401"></a>00401       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg2,<span class="keyword">true</span>);
<a name="l00402"></a>00402 
<a name="l00403"></a>00403       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 2)); <span class="comment">// by yeting</span>
<a name="l00404"></a>00404 
<a name="l00405"></a>00405       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00406"></a>00406       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00407"></a>00407       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00408"></a>00408       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00409"></a>00409 
<a name="l00410"></a>00410       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 3)); <span class="comment">// by yeting</span>
<a name="l00411"></a>00411 
<a name="l00412"></a>00412       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00413"></a>00413       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00414"></a>00414       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg0,<span class="keyword">true</span>);
<a name="l00415"></a>00415       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00416"></a>00416 
<a name="l00417"></a>00417       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 4)); <span class="comment">// by yeting</span>
<a name="l00418"></a>00418 
<a name="l00419"></a>00419       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00420"></a>00420       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v));
<a name="l00421"></a>00421       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1,<span class="keyword">true</span>);
<a name="l00422"></a>00422       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg2,<span class="keyword">true</span>);
<a name="l00423"></a>00423 
<a name="l00424"></a>00424       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 5)); <span class="comment">// by yeting</span>
<a name="l00425"></a>00425 
<a name="l00426"></a>00426       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00427"></a>00427       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1Lit.html">Lit</a>(v),<span class="keyword">true</span>);
<a name="l00428"></a>00428       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg1);
<a name="l00429"></a>00429       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(arg2);
<a name="l00430"></a>00430 
<a name="l00431"></a>00431       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#gad68b269642c7545c0fc119b7a74a3f32">CNFITEtranslate</a>(e, after,thms, 6)); <span class="comment">// by yeting</span>
<a name="l00432"></a>00432       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00433"></a>00433       <span class="keywordflow">break</span>;
<a name="l00434"></a>00434     }
<a name="l00435"></a>00435     <span class="keywordflow">default</span>:
<a name="l00436"></a>00436     {
<a name="l00437"></a>00437       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!e.<a class="code" href="group__ExprPkg.html#ga5fe5158aefab64fd8adda48ecebb98f9" title="An abstract atomic formua is an atomic formula or a quantified formula.">isAbsAtomicFormula</a>() || <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[v].expr == e,
<a name="l00438"></a>00438                   <span class="stringliteral">&quot;Corrupted Varinfo&quot;</span>);
<a name="l00439"></a>00439       <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga5fe5158aefab64fd8adda48ecebb98f9" title="An abstract atomic formua is an atomic formula or a quantified formula.">isAbsAtomicFormula</a>()) {
<a name="l00440"></a>00440         <a class="code" href="classSAT_1_1CNF__Manager.html#aad4c1fe260c5c15d94a4010d82569e74" title="Register a new atomic formula.">registerAtom</a>(e, thmIn);
<a name="l00441"></a>00441         <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html">Lit</a>(v);
<a name="l00442"></a>00442       }
<a name="l00443"></a>00443 
<a name="l00444"></a>00444       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool(), <span class="stringliteral">&quot;Found impossible case when cnf-formula is enabled&quot;</span>);
<a name="l00445"></a>00445 
<a name="l00446"></a>00446       <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a9c44bb0556800d1f05eca51d68a73e67" title="Recursively traverse an expression with an embedded term ITE.">replaceITErec</a>(e, v, translateOnly);
<a name="l00447"></a>00447       <span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>&amp; e2 = thm.<a class="code" href="classCVC3_1_1Theorem.html#a97d957fcbf9094480851b1d2e5d3729f">getRHS</a>();
<a name="l00448"></a>00448       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(e2.<a class="code" href="group__ExprPkg.html#ga5fe5158aefab64fd8adda48ecebb98f9" title="An abstract atomic formua is an atomic formula or a quantified formula.">isAbsAtomicFormula</a>(), <span class="stringliteral">&quot;Expected AbsAtomicFormula&quot;</span>);
<a name="l00449"></a>00449       <span class="keywordflow">if</span> (e2.<a class="code" href="group__ExprPkg.html#gabe0b99a2c155f75ceedd4f06263ddebb">isTranslated</a>()) {
<a name="l00450"></a>00450         <span class="comment">// Ugly corner case: we happen to create an expression that has been</span>
<a name="l00451"></a>00451         <span class="comment">// created before.  We remove the current variable and fix up the</span>
<a name="l00452"></a>00452         <span class="comment">// translation stack.</span>
<a name="l00453"></a>00453         <span class="keywordflow">if</span> (translateOnly) {
<a name="l00454"></a>00454           <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(v == <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e2], <span class="stringliteral">&quot;Expected literal match&quot;</span>);
<a name="l00455"></a>00455         }
<a name="l00456"></a>00456         <span class="keywordflow">else</span> {
<a name="l00457"></a>00457           <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.resize(v);
<a name="l00458"></a>00458           <span class="keywordflow">while</span> (!<a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.empty() &amp;&amp;
<a name="l00459"></a>00459                  <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.back() == v) {
<a name="l00460"></a>00460             <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.pop_back();
<a name="l00461"></a>00461           }
<a name="l00462"></a>00462           <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#aeffd58f05fbeb8f381ba2050adef7a2d">find</a>(e2) != <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#a0ea2aa250fd1431c311d83f32862bba7">end</a>(),
<a name="l00463"></a>00463                       <span class="stringliteral">&quot;Expected existing literal&quot;</span>);
<a name="l00464"></a>00464           v = <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e2];
<a name="l00465"></a>00465           <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e] = v;
<a name="l00466"></a>00466           <span class="keywordflow">while</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.size() &lt; <a class="code" href="classSAT_1_1CNF__Manager.html#a5ef71065232a1ffbdce52398b1faafc4" title="Queue of theorems to translate.">d_translateQueueThms</a>.size()) {
<a name="l00467"></a>00467             <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.push_back(v);
<a name="l00468"></a>00468           }
<a name="l00469"></a>00469         }
<a name="l00470"></a>00470       }
<a name="l00471"></a>00471       <span class="keywordflow">else</span> {
<a name="l00472"></a>00472         e2.<a class="code" href="group__ExprPkg.html#gaf941ebb5b9a8e6ee0ca004d59425fb42" title="Set the translated flag for this Expr.">setTranslated</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a60a763224b0c38233c65bfa1374f6ab0" title="Whether expr has already been translated.">d_bottomScope</a>);
<a name="l00473"></a>00473         <span class="comment">// Corner case: don&#39;t register reflexive equality</span>
<a name="l00474"></a>00474         <span class="keywordflow">if</span> (!e2.<a class="code" href="group__ExprPkg.html#gac4af2026c180da0f18d66ac616f61f3a">isEq</a>() || e2[0] != e2[1]) <a class="code" href="classSAT_1_1CNF__Manager.html#aad4c1fe260c5c15d94a4010d82569e74" title="Register a new atomic formula.">registerAtom</a>(e2, thmIn);
<a name="l00475"></a>00475         <span class="keywordflow">if</span> (!translateOnly) {
<a name="l00476"></a>00476           <span class="keywordflow">if</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#aeffd58f05fbeb8f381ba2050adef7a2d">find</a>(e2) == <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>.<a class="code" href="classCVC3_1_1ExprHashMap.html#a0ea2aa250fd1431c311d83f32862bba7">end</a>()) {
<a name="l00477"></a>00477             <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[v].expr = e2;
<a name="l00478"></a>00478             <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e2] = v;
<a name="l00479"></a>00479           }
<a name="l00480"></a>00480           <span class="keywordflow">else</span> {
<a name="l00481"></a>00481             <span class="comment">// Same corner case in an untranslated expr</span>
<a name="l00482"></a>00482             <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>.resize(v);
<a name="l00483"></a>00483             <span class="keywordflow">while</span> (!<a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.empty() &amp;&amp;
<a name="l00484"></a>00484                    <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.back() == v) {
<a name="l00485"></a>00485               <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.pop_back();
<a name="l00486"></a>00486             }
<a name="l00487"></a>00487             v = <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e2];
<a name="l00488"></a>00488             <a class="code" href="classSAT_1_1CNF__Manager.html#ad3d2c901c7b8cc277639fb2aff90797b" title="Map from Exprs to Vars representing those Exprs.">d_cnfVars</a>[e] = v;
<a name="l00489"></a>00489             <span class="keywordflow">while</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.size() &lt; <a class="code" href="classSAT_1_1CNF__Manager.html#a5ef71065232a1ffbdce52398b1faafc4" title="Queue of theorems to translate.">d_translateQueueThms</a>.size()) {
<a name="l00490"></a>00490               <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.push_back(v);
<a name="l00491"></a>00491             }
<a name="l00492"></a>00492           }
<a name="l00493"></a>00493         }
<a name="l00494"></a>00494       }
<a name="l00495"></a>00495       <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html">Lit</a>(v);
<a name="l00496"></a>00496     }
<a name="l00497"></a>00497   }
<a name="l00498"></a>00498 
<a name="l00499"></a>00499   <span class="comment">// Record fanins / fanouts</span>
<a name="l00500"></a>00500   <a class="code" href="classSAT_1_1Lit.html">Lit</a> l;
<a name="l00501"></a>00501   <span class="keywordflow">for</span> (i = e.<a class="code" href="group__ExprPkg.html#gac890e13db184610276fc533fa4b4fe99" title="Begin iterator.">begin</a>(), iend = e.<a class="code" href="group__ExprPkg.html#gaf6048a5030c8fa2511bf5dfee868e653" title="End iterator.">end</a>(); i != iend; ++i) {
<a name="l00502"></a>00502     l = <a class="code" href="classSAT_1_1CNF__Manager.html#a78c85b8b8b747f72d973ed0835294c5e" title="Look up the CNF literal for an Expr.">getCNFLit</a>(*i);
<a name="l00503"></a>00503     <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!l.<a class="code" href="classSAT_1_1Lit.html#ad5f6236c582c95356d720a7401623f36">isNull</a>(), <span class="stringliteral">&quot;Expected non-null literal&quot;</span>);
<a name="l00504"></a>00504     <span class="keywordflow">if</span> (!translateOnly) <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[v].fanins.push_back(l);
<a name="l00505"></a>00505     <span class="keywordflow">if</span> (l.<a class="code" href="classSAT_1_1Lit.html#aeb84cef22c7dbf459f95dff9b7cbb4a7">isVar</a>()) <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[l.<a class="code" href="classSAT_1_1Lit.html#a57e2e6e37cad9595c3edbea88a41262f">getVar</a>()].fanouts.push_back(v);
<a name="l00506"></a>00506   }
<a name="l00507"></a>00507   <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1Lit.html">Lit</a>(v);
<a name="l00508"></a>00508 }
<a name="l00509"></a>00509 
<a name="l00510"></a><a class="code" href="classSAT_1_1CNF__Manager.html#abc4a95f97c6d2aa7a7584cd1bc30b743">00510</a> <a class="code" href="classSAT_1_1Lit.html">Lit</a> <a class="code" href="classSAT_1_1CNF__Manager.html#abc4a95f97c6d2aa7a7584cd1bc30b743" title="Recursively translate e into cnf.">CNF_Manager::translateExpr</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a>&amp; thmIn, <a class="code" href="classSAT_1_1CNF__Formula.html">CNF_Formula</a>&amp; cnf)
<a name="l00511"></a>00511 {
<a name="l00512"></a>00512   <a class="code" href="classSAT_1_1Lit.html">Lit</a> l;
<a name="l00513"></a>00513   <a class="code" href="classSAT_1_1Var.html">Var</a> v;
<a name="l00514"></a>00514   <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> e = thmIn.<a class="code" href="classCVC3_1_1Theorem.html#af2b97ae5d270ddf1013bf4f3867a7e5d">getExpr</a>();
<a name="l00515"></a>00515   <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> thm;
<a name="l00516"></a>00516   <span class="keywordtype">bool</span> translateOnly;
<a name="l00517"></a>00517 
<a name="l00518"></a>00518   <a class="code" href="classSAT_1_1Lit.html">Lit</a> ret = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e, cnf, thmIn);
<a name="l00519"></a>00519 
<a name="l00520"></a>00520   <span class="keywordflow">while</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.size()) {
<a name="l00521"></a>00521     v = <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.front();
<a name="l00522"></a>00522     <a class="code" href="classSAT_1_1CNF__Manager.html#ac2f7df4bf6d27d29de19037e34d08df7" title="Queue of fanouts corresponding to thms to translate.">d_translateQueueVars</a>.pop_front();
<a name="l00523"></a>00523     thm = <a class="code" href="classSAT_1_1CNF__Manager.html#a5ef71065232a1ffbdce52398b1faafc4" title="Queue of theorems to translate.">d_translateQueueThms</a>.front();
<a name="l00524"></a>00524     <a class="code" href="classSAT_1_1CNF__Manager.html#a5ef71065232a1ffbdce52398b1faafc4" title="Queue of theorems to translate.">d_translateQueueThms</a>.pop_front();
<a name="l00525"></a>00525     translateOnly = <a class="code" href="classSAT_1_1CNF__Manager.html#ae23cfc40d069a750c70dd4ed99a18564" title="Whether thm to translate is &quot;translate only&quot;.">d_translateQueueFlags</a>.front();
<a name="l00526"></a>00526     <a class="code" href="classSAT_1_1CNF__Manager.html#ae23cfc40d069a750c70dd4ed99a18564" title="Whether thm to translate is &quot;translate only&quot;.">d_translateQueueFlags</a>.pop_front();
<a name="l00527"></a>00527     l = <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(thm.<a class="code" href="classCVC3_1_1Theorem.html#af2b97ae5d270ddf1013bf4f3867a7e5d">getExpr</a>(), cnf, thmIn);
<a name="l00528"></a>00528     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00529"></a>00529     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(l);
<a name="l00530"></a>00530     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a3b0eb426b9713bbc92041f046dd83ab5">registerUnit</a>();
<a name="l00531"></a>00531 
<a name="l00532"></a>00532     <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> newThm = <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga0aaf202cffbc31fe85e7599ec2906319">CNFAddUnit</a>(thm);
<a name="l00533"></a>00533     <span class="comment">//    d_theorems.insert(d_clauseIdNext, thm);</span>
<a name="l00534"></a>00534     <span class="comment">//    cnf.getCurrentClause().setClauseTheorem(thmIn); // by yeting</span>
<a name="l00535"></a>00535     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(newThm); <span class="comment">// by yeting</span>
<a name="l00536"></a>00536 
<a name="l00537"></a>00537     <span class="comment">/*</span>
<a name="l00538"></a>00538 <span class="comment">    cout&lt;&lt;&quot;set clause theorem 1&quot; &lt;&lt; thm &lt;&lt; endl;</span>
<a name="l00539"></a>00539 <span class="comment">    cout&lt;&lt;&quot;set clause theorem 2 &quot; &lt;&lt; thmIn &lt;&lt; endl;</span>
<a name="l00540"></a>00540 <span class="comment">    cout&lt;&lt;&quot;set clause print&quot; ;  cnf.getCurrentClause().print() ; cout&lt;&lt;endl;</span>
<a name="l00541"></a>00541 <span class="comment">    cout&lt;&lt;&quot;set clause id &quot; &lt;&lt; d_clauseIdNext &lt;&lt; endl;</span>
<a name="l00542"></a>00542 <span class="comment">    */</span>
<a name="l00543"></a>00543     <span class="keywordflow">if</span> (!translateOnly) <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[v].fanins.push_back(l);
<a name="l00544"></a>00544     <a class="code" href="classSAT_1_1CNF__Manager.html#af6bda95f4cc0f85ac6cba04c66bd4a69" title="vector that maps a variable index to information for that variable">d_varInfo</a>[l.<a class="code" href="classSAT_1_1Lit.html#a57e2e6e37cad9595c3edbea88a41262f">getVar</a>()].fanouts.push_back(v);
<a name="l00545"></a>00545   }
<a name="l00546"></a>00546   <span class="keywordflow">return</span> ret;
<a name="l00547"></a>00547 }
<a name="l00548"></a>00548 
<a name="l00549"></a>00549 
<a name="l00550"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">00550</a> <span class="keywordtype">void</span> <a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">CNF_Manager::cons</a>(<span class="keywordtype">unsigned</span> lb, <span class="keywordtype">unsigned</span> ub, <span class="keyword">const</span> <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a>&amp; e2, vector&lt;unsigned&gt;&amp; newLits)
<a name="l00551"></a>00551 {
<a name="l00552"></a>00552   <span class="keywordflow">if</span> (lb == ub) {
<a name="l00553"></a>00553     newLits.push_back(lb);
<a name="l00554"></a>00554     <span class="keywordflow">return</span>;
<a name="l00555"></a>00555   }
<a name="l00556"></a>00556   <span class="keywordtype">unsigned</span> new_lb = (ub-lb+1)/2 + lb;
<a name="l00557"></a>00557   <span class="keywordtype">unsigned</span> index;
<a name="l00558"></a>00558   <a class="code" href="namespaceCVC3.html#a060d21b3207cc3471e24f8dbcff3498b">QueryResult</a> res;
<a name="l00559"></a>00559   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a93cbbe8c21c2404b03ccaa43636d5f59" title="Checkpoint the current context and increase the scope level.">push</a>();
<a name="l00560"></a>00560   <span class="keywordflow">for</span> (index = new_lb; index &lt;= ub; ++index) {
<a name="l00561"></a>00561     <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#ad57f0a783141d3c7b0424102ea8724ac" title="Assert a new formula in the current context.">assertFormula</a>(e2[index].negate());
<a name="l00562"></a>00562   }
<a name="l00563"></a>00563   res = <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a93b515a079fc8fdae5826dfcc343909e" title="Check validity of e in the current context.">query</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a9050dd9dbfb463a488d6f9fe98ef968a" title="Return FALSE Expr.">falseExpr</a>());
<a name="l00564"></a>00564   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a3cee14a9c3b852b501a0594dd951f60c" title="Restore the current context to its state at the last checkpoint.">pop</a>();
<a name="l00565"></a>00565   <span class="keywordflow">if</span> (res == <a class="code" href="namespaceCVC3.html#a060d21b3207cc3471e24f8dbcff3498ba24f8f4860dbe6fd65883a9d7cbd2f576">VALID</a>) {
<a name="l00566"></a>00566     <a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">cons</a>(new_lb, ub, e2, newLits);
<a name="l00567"></a>00567     <span class="keywordflow">return</span>;
<a name="l00568"></a>00568   }
<a name="l00569"></a>00569 
<a name="l00570"></a>00570   <span class="keywordtype">unsigned</span> new_ub = new_lb-1;
<a name="l00571"></a>00571   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a93cbbe8c21c2404b03ccaa43636d5f59" title="Checkpoint the current context and increase the scope level.">push</a>();
<a name="l00572"></a>00572   <span class="keywordflow">for</span> (index = lb; index &lt;= new_ub; ++index) {
<a name="l00573"></a>00573     <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#ad57f0a783141d3c7b0424102ea8724ac" title="Assert a new formula in the current context.">assertFormula</a>(e2[index].negate());
<a name="l00574"></a>00574   }
<a name="l00575"></a>00575   res = <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a93b515a079fc8fdae5826dfcc343909e" title="Check validity of e in the current context.">query</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a9050dd9dbfb463a488d6f9fe98ef968a" title="Return FALSE Expr.">falseExpr</a>());
<a name="l00576"></a>00576   <span class="keywordflow">if</span> (res == <a class="code" href="namespaceCVC3.html#a060d21b3207cc3471e24f8dbcff3498ba24f8f4860dbe6fd65883a9d7cbd2f576">VALID</a>) {
<a name="l00577"></a>00577     <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a3cee14a9c3b852b501a0594dd951f60c" title="Restore the current context to its state at the last checkpoint.">pop</a>();
<a name="l00578"></a>00578     <a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">cons</a>(lb, new_ub, e2, newLits);
<a name="l00579"></a>00579     <span class="keywordflow">return</span>;
<a name="l00580"></a>00580   }
<a name="l00581"></a>00581 
<a name="l00582"></a>00582   <a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">cons</a>(new_lb, ub, e2, newLits);
<a name="l00583"></a>00583   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a3cee14a9c3b852b501a0594dd951f60c" title="Restore the current context to its state at the last checkpoint.">pop</a>();
<a name="l00584"></a>00584   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a93cbbe8c21c2404b03ccaa43636d5f59" title="Checkpoint the current context and increase the scope level.">push</a>();
<a name="l00585"></a>00585   <span class="keywordflow">for</span> (index = 0; index &lt; newLits.size(); ++index) {
<a name="l00586"></a>00586     <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#ad57f0a783141d3c7b0424102ea8724ac" title="Assert a new formula in the current context.">assertFormula</a>(e2[newLits[index]].negate());
<a name="l00587"></a>00587   }
<a name="l00588"></a>00588   <a class="code" href="classSAT_1_1CNF__Manager.html#a56db0a07323ee4b11df78f88c8022db5">cons</a>(lb, new_ub, e2, newLits);
<a name="l00589"></a>00589   <a class="code" href="classSAT_1_1CNF__Manager.html#accef3514f49a030e3000e933a0cb7f34" title="For clause minimization.">d_vc</a>-&gt;<a class="code" href="classCVC3_1_1ValidityChecker.html#a3cee14a9c3b852b501a0594dd951f60c" title="Restore the current context to its state at the last checkpoint.">pop</a>();
<a name="l00590"></a>00590 }
<a name="l00591"></a>00591 
<a name="l00592"></a>00592 
<a name="l00593"></a><a class="code" href="classSAT_1_1CNF__Manager.html#ad8e26f917ea3a87a1013cbd154d16069">00593</a> <span class="keywordtype">void</span> <a class="code" href="classSAT_1_1CNF__Manager.html#ad8e26f917ea3a87a1013cbd154d16069" title="Convert thm A |- B (A is a set of literals) into one or more clauses.">CNF_Manager::convertLemma</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a>&amp; thm, <a class="code" href="classSAT_1_1CNF__Formula.html">CNF_Formula</a>&amp; cnf)
<a name="l00594"></a>00594 {
<a name="l00595"></a>00595   <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a15e2d3d65a38c23558a0ae8cf35f1938">empty</a>(), <span class="stringliteral">&quot;Expected empty cnf&quot;</span>);
<a name="l00596"></a>00596   vector&lt;Theorem&gt; clauses;
<a name="l00597"></a>00597 
<a name="l00598"></a>00598   <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga95a3d54cd5764e677d565f227b07eace" title="Learned clause rule: .">learnedClauses</a>(thm, clauses, <span class="keyword">false</span>);
<a name="l00599"></a>00599 
<a name="l00600"></a>00600   vector&lt;Theorem&gt;::iterator i = clauses.begin(), iend = clauses.end();
<a name="l00601"></a>00601   <span class="keywordflow">for</span> (; i &lt; iend; ++i) {
<a name="l00602"></a>00602     <span class="comment">// for dumping lemmas:</span>
<a name="l00603"></a>00603     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00604"></a>00604     <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> e = (*i).getExpr();
<a name="l00605"></a>00605     <span class="keywordflow">if</span> (!e.<a class="code" href="group__ExprPkg.html#ga36f1eff876808586db368dc1b6da5f56">isOr</a>()) {
<a name="l00606"></a>00606       <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a78c85b8b8b747f72d973ed0835294c5e" title="Look up the CNF literal for an Expr.">getCNFLit</a>(e).isNull(), <span class="stringliteral">&quot;Unknown literal&quot;</span>);
<a name="l00607"></a>00607       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a78c85b8b8b747f72d973ed0835294c5e" title="Look up the CNF literal for an Expr.">getCNFLit</a>(e));
<a name="l00608"></a>00608       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a3b0eb426b9713bbc92041f046dd83ab5">registerUnit</a>();
<a name="l00609"></a>00609       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga0aaf202cffbc31fe85e7599ec2906319">CNFAddUnit</a>(*i));
<a name="l00610"></a>00610     }
<a name="l00611"></a>00611     <span class="keywordflow">else</span> {
<a name="l00612"></a>00612       <a class="code" href="classCVC3_1_1Expr_1_1iterator.html">Expr::iterator</a> jend = e.<a class="code" href="group__ExprPkg.html#gaf6048a5030c8fa2511bf5dfee868e653" title="End iterator.">end</a>();
<a name="l00613"></a>00613       <span class="keywordflow">for</span> (<a class="code" href="classCVC3_1_1Expr_1_1iterator.html">Expr::iterator</a> j = e.<a class="code" href="group__ExprPkg.html#gac890e13db184610276fc533fa4b4fe99" title="Begin iterator.">begin</a>(); j != jend; ++j) {
<a name="l00614"></a>00614         <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(!<a class="code" href="classSAT_1_1CNF__Manager.html#a78c85b8b8b747f72d973ed0835294c5e" title="Look up the CNF literal for an Expr.">getCNFLit</a>(*j).<a class="code" href="classSAT_1_1Lit.html#ad5f6236c582c95356d720a7401623f36">isNull</a>(), <span class="stringliteral">&quot;Unknown literal&quot;</span>);
<a name="l00615"></a>00615         cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a78c85b8b8b747f72d973ed0835294c5e" title="Look up the CNF literal for an Expr.">getCNFLit</a>(*j));
<a name="l00616"></a>00616       }
<a name="l00617"></a>00617       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(<a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga218381b5e2fddbd76c0c81ca3013c0f8">CNFConvert</a>(e, *i));
<a name="l00618"></a>00618     }
<a name="l00619"></a>00619   }
<a name="l00620"></a>00620 }
<a name="l00621"></a>00621 
<a name="l00622"></a>00622 
<a name="l00623"></a><a class="code" href="classSAT_1_1CNF__Manager.html#a5cf1943a3bc3773fd0d8f64c123478f7">00623</a> <a class="code" href="classSAT_1_1Lit.html">Lit</a> <a class="code" href="classSAT_1_1CNF__Manager.html#a5cf1943a3bc3773fd0d8f64c123478f7" title="Given thm of form A |- B, convert B to CNF and add it to cnf.">CNF_Manager::addAssumption</a>(<span class="keyword">const</span> <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a>&amp; thm, <a class="code" href="classSAT_1_1CNF__Formula.html">CNF_Formula</a>&amp; cnf)
<a name="l00624"></a>00624 {
<a name="l00625"></a>00625   <span class="keywordflow">if</span> (<a class="code" href="classSAT_1_1CNF__Manager.html#a6d98dc9308632f87bfff6a121a33d4ba" title="Reference to command-line flags.">d_flags</a>[<span class="stringliteral">&quot;cnf-formula&quot;</span>].getBool()) {
<a name="l00626"></a>00626     <a class="code" href="classCVC3_1_1Expr.html" title="Data structure of expressions in CVC3.">Expr</a> e = thm.<a class="code" href="classCVC3_1_1Theorem.html#af2b97ae5d270ddf1013bf4f3867a7e5d">getExpr</a>();
<a name="l00627"></a>00627     <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(e.<a class="code" href="group__ExprPkg.html#ga36f1eff876808586db368dc1b6da5f56">isOr</a>() 
<a name="l00628"></a>00628     || (e.<a class="code" href="group__ExprPkg.html#ga1a898858ccadce833df5a294c7740f11">isNot</a>() &amp;&amp; e[0].<a class="code" href="group__ExprPkg.html#ga6173f64b22cba76472cd0c814bbf6dae">isFalse</a>()) 
<a name="l00629"></a>00629     || (e.<a class="code" href="group__ExprPkg.html#ga1a898858ccadce833df5a294c7740f11">isNot</a>() &amp;&amp; e[0].<a class="code" href="group__ExprPkg.html#gadf8596df73fa69ff8e6a22b9321f5c34">isTrue</a>()), 
<a name="l00630"></a>00630     <span class="stringliteral">&quot;expr:&quot;</span> + e.<a class="code" href="group__ExprPkg.html#gaf3028bb1619f8cc69b66ec712e1adb54" title="Print the expression to a string.">toString</a>() + <span class="stringliteral">&quot; is not an OR Expr or Ture or False&quot;</span> ); 
<a name="l00631"></a>00631     cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00632"></a>00632     <span class="keywordflow">if</span> (e.<a class="code" href="group__ExprPkg.html#ga36f1eff876808586db368dc1b6da5f56">isOr</a>()){
<a name="l00633"></a>00633       <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; e.<a class="code" href="group__ExprPkg.html#ga28b901d05e52a5c646f83a95cc74f94b">arity</a>(); i++){
<a name="l00634"></a>00634   <a class="code" href="classSAT_1_1Lit.html">Lit</a> l = (<a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[i], cnf, thm));
<a name="l00635"></a>00635   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(l);
<a name="l00636"></a>00636       }
<a name="l00637"></a>00637       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(thm);
<a name="l00638"></a>00638       <span class="keywordflow">return</span> <a class="code" href="classSAT_1_1CNF__Manager.html#a4810c6cb09582d0b2bb41057753d0ae4" title="Recursively translate e into cnf.">translateExprRec</a>(e[0], cnf, thm) ;;
<a name="l00639"></a>00639     }
<a name="l00640"></a>00640     <span class="keywordflow">else</span>  {
<a name="l00641"></a>00641       <a class="code" href="classSAT_1_1Lit.html">Lit</a> l = <a class="code" href="classSAT_1_1CNF__Manager.html#abc4a95f97c6d2aa7a7584cd1bc30b743" title="Recursively translate e into cnf.">translateExpr</a>(thm, cnf);
<a name="l00642"></a>00642       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(l);
<a name="l00643"></a>00643       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a3b0eb426b9713bbc92041f046dd83ab5">registerUnit</a>();
<a name="l00644"></a>00644       cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(thm);
<a name="l00645"></a>00645       <span class="keywordflow">return</span> l;
<a name="l00646"></a>00646     }
<a name="l00647"></a>00647   }
<a name="l00648"></a>00648   
<a name="l00649"></a>00649 
<a name="l00650"></a>00650   <a class="code" href="classSAT_1_1Lit.html">Lit</a> l = <a class="code" href="classSAT_1_1CNF__Manager.html#abc4a95f97c6d2aa7a7584cd1bc30b743" title="Recursively translate e into cnf.">translateExpr</a>(thm, cnf);
<a name="l00651"></a>00651   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00652"></a>00652   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(l);
<a name="l00653"></a>00653   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a3b0eb426b9713bbc92041f046dd83ab5">registerUnit</a>();
<a name="l00654"></a>00654 
<a name="l00655"></a>00655 
<a name="l00656"></a>00656 <span class="comment">//   if(concreteLit(l) != thm.getExpr()){</span>
<a name="l00657"></a>00657 <span class="comment">//     cout&lt;&lt;&quot;fail addunit 3&quot; &lt;&lt; endl;</span>
<a name="l00658"></a>00658 <span class="comment">//   }</span>
<a name="l00659"></a>00659 
<a name="l00660"></a>00660   <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> newThm = <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga0aaf202cffbc31fe85e7599ec2906319">CNFAddUnit</a>(thm);
<a name="l00661"></a>00661   <span class="comment">//  d_theorems[d_clauseIdNext] = thm;</span>
<a name="l00662"></a>00662   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(newThm); <span class="comment">// by yeting</span>
<a name="l00663"></a>00663   <span class="comment">/*</span>
<a name="l00664"></a>00664 <span class="comment">  cout&lt;&lt;&quot;set clause theorem  addassumption&quot; &lt;&lt; thm &lt;&lt; endl;</span>
<a name="l00665"></a>00665 <span class="comment">  cout&lt;&lt;&quot;set clause print&quot; ;  </span>
<a name="l00666"></a>00666 <span class="comment">  cnf.getCurrentClause().print() ; </span>
<a name="l00667"></a>00667 <span class="comment">  cout&lt;&lt;endl;</span>
<a name="l00668"></a>00668 <span class="comment">  cout&lt;&lt;&quot;set clause id &quot; &lt;&lt; d_clauseIdNext &lt;&lt; endl;</span>
<a name="l00669"></a>00669 <span class="comment">  */</span>
<a name="l00670"></a>00670   <span class="keywordflow">return</span> l;
<a name="l00671"></a>00671 }
<a name="l00672"></a>00672 
<a name="l00673"></a>00673 
<a name="l00674"></a><a class="code" href="classSAT_1_1CNF__Manager.html#aac0a2f51c8376029b88e1febc4cbd669">00674</a> <a class="code" href="classSAT_1_1Lit.html">Lit</a> <a class="code" href="classSAT_1_1CNF__Manager.html#aac0a2f51c8376029b88e1febc4cbd669" title="Convert thm to CNF and add it to the current formula.">CNF_Manager::addLemma</a>(<a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> thm, <a class="code" href="classSAT_1_1CNF__Formula.html">CNF_Formula</a>&amp; cnf)
<a name="l00675"></a>00675 {
<a name="l00676"></a>00676 
<a name="l00677"></a>00677   vector&lt;Theorem&gt; clauses;
<a name="l00678"></a>00678   <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga95a3d54cd5764e677d565f227b07eace" title="Learned clause rule: .">learnedClauses</a>(thm, clauses, <span class="keyword">true</span>);
<a name="l00679"></a>00679   <a class="code" href="debug_8h.html#a40dac3bdb2166ffc852ee8b1489d2b56">DebugAssert</a>(clauses.size() == 1, <span class="stringliteral">&quot;expected single clause&quot;</span>);
<a name="l00680"></a>00680 
<a name="l00681"></a>00681   <a class="code" href="classSAT_1_1Lit.html">Lit</a> l = <a class="code" href="classSAT_1_1CNF__Manager.html#abc4a95f97c6d2aa7a7584cd1bc30b743" title="Recursively translate e into cnf.">translateExpr</a>(clauses[0], cnf);
<a name="l00682"></a>00682   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ab9f3ffd03469b827138a14392960ba30">newClause</a>();
<a name="l00683"></a>00683   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a4c59929d06b987ed68639f1b85a62606">addLiteral</a>(l);
<a name="l00684"></a>00684   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#a3b0eb426b9713bbc92041f046dd83ab5">registerUnit</a>();
<a name="l00685"></a>00685 
<a name="l00686"></a>00686  
<a name="l00687"></a>00687 <span class="comment">//    if(concreteLit(l) != clauses[0].getExpr()){</span>
<a name="l00688"></a>00688 <span class="comment">//     cout&lt;&lt;&quot;fail addunit 4&quot; &lt;&lt; endl;</span>
<a name="l00689"></a>00689 <span class="comment">//   }</span>
<a name="l00690"></a>00690 
<a name="l00691"></a>00691   <a class="code" href="classCVC3_1_1Theorem.html">Theorem</a> newThm = <a class="code" href="classSAT_1_1CNF__Manager.html#a5b7d49543538f5dc44fc89e132d0b5d5" title="Rules for manipulating CNF.">d_rules</a>-&gt;<a class="code" href="group__CNF__Rules.html#ga0aaf202cffbc31fe85e7599ec2906319">CNFAddUnit</a>(clauses[0]); 
<a name="l00692"></a>00692   <span class="comment">//  d_theorems.insert(d_clauseIdNext, clause);</span>
<a name="l00693"></a>00693   cnf.<a class="code" href="classSAT_1_1CNF__Formula.html#ac7c33df20bc0ac09a831de55bc4773a9">getCurrentClause</a>().<a class="code" href="classSAT_1_1Clause.html#a69be447d7ada144c2a905cf42f4a7a82">setClauseTheorem</a>(newThm); <span class="comment">//by yeting</span>
<a name="l00694"></a>00694 
<a name="l00695"></a>00695   <span class="comment">/*</span>
<a name="l00696"></a>00696 <span class="comment">  cout&lt;&lt;&quot;set clause theorem  addlemma&quot; &lt;&lt; thm &lt;&lt; endl;</span>
<a name="l00697"></a>00697 <span class="comment">  cout&lt;&lt;&quot;set clause print&quot; ;  </span>
<a name="l00698"></a>00698 <span class="comment">  cnf.getCurrentClause().print() ; </span>
<a name="l00699"></a>00699 <span class="comment">  cout&lt;&lt;endl;</span>
<a name="l00700"></a>00700 <span class="comment">  cout&lt;&lt;&quot;set clause id &quot; &lt;&lt; d_clauseIdNext &lt;&lt; endl;</span>
<a name="l00701"></a>00701 <span class="comment">  */</span>
<a name="l00702"></a>00702   <span class="keywordflow">return</span> l;
<a name="l00703"></a>00703 }
<a name="l00704"></a>00704 
</pre></div></div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Wed Sep 7 2011 for CVC3 by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>