PageRenderTime 48ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/Source/VCGeneration/Context.cs

http://boogie.codeplex.com
C# | 233 lines | 173 code | 36 blank | 24 comment | 35 complexity | 755477fd05b4d9df29accff769579b3c MD5 | raw file
  1. //-----------------------------------------------------------------------------
  2. //
  3. // Copyright (C) Microsoft Corporation. All Rights Reserved.
  4. //
  5. //-----------------------------------------------------------------------------
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Text;
  10. using System.Diagnostics.Contracts;
  11. using Microsoft.Boogie.VCExprAST;
  12. namespace Microsoft.Boogie
  13. {
  14. /// <summary>
  15. /// The methods of this class are called in the following order:
  16. /// DeclareType*
  17. /// (DeclareConstant DeclareFunction)*
  18. /// AddAxiom*
  19. /// DeclareGlobalVariable*
  20. /// At this time, all "attributes" are passed in as null.
  21. /// </summary>
  22. [ContractClass(typeof(ProverContextContracts))]
  23. public abstract class ProverContext : ICloneable {
  24. protected virtual void ProcessDeclaration(Declaration decl) {Contract.Requires(decl != null);}
  25. public virtual void DeclareType(TypeCtorDecl t, string attributes) {Contract.Requires(t != null); ProcessDeclaration(t); }
  26. public virtual void DeclareConstant(Constant c, bool uniq, string attributes) {Contract.Requires(c != null); ProcessDeclaration(c); }
  27. public virtual void DeclareFunction(Function f, string attributes) {Contract.Requires(f != null); ProcessDeclaration(f); }
  28. public virtual void AddAxiom(Axiom a, string attributes) {Contract.Requires(a != null); ProcessDeclaration(a); }
  29. public virtual void DeclareGlobalVariable(GlobalVariable v, string attributes) {Contract.Requires(v != null); ProcessDeclaration(v); }
  30. public abstract void AddAxiom(VCExpr vc);
  31. public abstract string Lookup(VCExprVar var);
  32. public abstract VCExpressionGenerator ExprGen { get; }
  33. public abstract Boogie2VCExprTranslator BoogieExprTranslator { get; }
  34. public abstract VCGenerationOptions VCGenOptions { get; }
  35. public abstract object Clone();
  36. }
  37. [ContractClassFor(typeof(ProverContext))]
  38. public abstract class ProverContextContracts:ProverContext{
  39. public override void AddAxiom(VCExpr vc) {
  40. }
  41. public override void AddAxiom(Axiom a, string attributes)
  42. {
  43. }
  44. public override VCExpressionGenerator ExprGen
  45. {
  46. get { Contract.Ensures(Contract.Result<VCExpressionGenerator>() != null);
  47. throw new NotImplementedException(); }
  48. }
  49. public override Boogie2VCExprTranslator BoogieExprTranslator
  50. {
  51. get { Contract.Ensures(Contract.Result<Boogie2VCExprTranslator>() != null);
  52. throw new NotImplementedException(); }
  53. }
  54. public override VCGenerationOptions VCGenOptions
  55. {
  56. get {Contract.Ensures(Contract.Result<VCGenerationOptions>() != null);
  57. throw new NotImplementedException(); }
  58. }
  59. public override object Clone()
  60. {
  61. Contract.Ensures(Contract.Result<object>() != null);
  62. throw new NotImplementedException();
  63. }
  64. }
  65. // -----------------------------------------------------------------------------------------------
  66. // -----------------------------------------------------------------------------------------------
  67. // -----------------------------------------------------------------------------------------------
  68. /// <summary>
  69. /// This ProverContext subclass is intended for use with untyped provers that do not require names
  70. /// to be declared before use. It constructs its context from unique constants and given axioms.
  71. /// </summary>
  72. public class DeclFreeProverContext : ProverContext {
  73. protected VCExpressionGenerator gen;
  74. protected VCGenerationOptions genOptions;
  75. protected Boogie2VCExprTranslator translator;
  76. protected OrderingAxiomBuilder orderingAxiomBuilder;
  77. protected List<Variable> distincts;
  78. protected List<VCExpr> axiomConjuncts;
  79. [ContractInvariantMethod]
  80. void ObjectInvariant() {
  81. Contract.Invariant(gen != null);
  82. Contract.Invariant(genOptions != null);
  83. Contract.Invariant(translator != null);
  84. Contract.Invariant(orderingAxiomBuilder != null);
  85. Contract.Invariant(cce.NonNullElements(distincts));
  86. Contract.Invariant(cce.NonNullElements(axiomConjuncts));
  87. }
  88. public VCExprTranslator/*?*/ exprTranslator;
  89. public DeclFreeProverContext(VCExpressionGenerator gen,
  90. VCGenerationOptions genOptions) {
  91. Contract.Requires(gen != null);
  92. Contract.Requires(genOptions != null);
  93. this.gen = gen;
  94. this.genOptions = genOptions;
  95. Boogie2VCExprTranslator t = new Boogie2VCExprTranslator (gen, genOptions);
  96. this.translator = t;
  97. OrderingAxiomBuilder oab = new OrderingAxiomBuilder(gen, t);
  98. Contract.Assert(oab != null);
  99. oab.Setup();
  100. this.orderingAxiomBuilder = oab;
  101. distincts = new List<Variable>();
  102. axiomConjuncts = new List<VCExpr>();
  103. exprTranslator = null;
  104. }
  105. protected DeclFreeProverContext(DeclFreeProverContext ctxt) {
  106. Contract.Requires(ctxt != null);
  107. this.gen = ctxt.gen;
  108. this.genOptions = ctxt.genOptions;
  109. Boogie2VCExprTranslator t = (Boogie2VCExprTranslator)ctxt.translator.Clone();
  110. Contract.Assert(t != null);
  111. this.translator = t;
  112. this.orderingAxiomBuilder = new OrderingAxiomBuilder(ctxt.gen, t, ctxt.orderingAxiomBuilder);
  113. StringBuilder cmds = new StringBuilder ();
  114. distincts = new List<Variable>(ctxt.distincts);
  115. axiomConjuncts = new List<VCExpr>(ctxt.axiomConjuncts);
  116. if (ctxt.exprTranslator == null)
  117. exprTranslator = null;
  118. else
  119. exprTranslator = (VCExprTranslator)cce.NonNull(ctxt.exprTranslator.Clone());
  120. }
  121. public override object Clone() {
  122. Contract.Ensures(Contract.Result<object>() != null);
  123. return new DeclFreeProverContext(this);
  124. }
  125. public override void DeclareFunction(Function f, string attributes) {//Contract.Requires(f != null);
  126. base.ProcessDeclaration(f);
  127. }
  128. public override void DeclareConstant(Constant c, bool uniq, string attributes) {//Contract.Requires(c != null);
  129. base.DeclareConstant(c, uniq, attributes);
  130. orderingAxiomBuilder.AddConstant(c);
  131. // TODO: make separate distinct lists for names coming from different types
  132. // e.g., one for strings, one for ints, one for program types.
  133. if (uniq){
  134. distincts.Add(c);
  135. }
  136. }
  137. public override void AddAxiom(Axiom ax, string attributes) {//Contract.Requires(ax != null);
  138. base.AddAxiom(ax, attributes);
  139. axiomConjuncts.Add(translator.Translate(ax.Expr));
  140. }
  141. public override void AddAxiom(VCExpr vc)
  142. {//Contract.Requires(vc != null);
  143. axiomConjuncts.Add(vc);
  144. }
  145. public VCExpr Axioms {
  146. get {Contract.Ensures(Contract.Result<VCExpr>() != null);
  147. VCExpr axioms = gen.NAry(VCExpressionGenerator.AndOp, axiomConjuncts);
  148. List<VCExpr>/*!>!*/ distinctVars = new List<VCExpr> ();
  149. foreach (Variable v in distincts){
  150. Contract.Assert(v != null);
  151. distinctVars.Add(translator.LookupVariable(v));}
  152. axioms = gen.AndSimp(gen.Distinct(distinctVars), axioms);
  153. if (CommandLineOptions.Clo.TypeEncodingMethod != CommandLineOptions.TypeEncoding.Monomorphic)
  154. axioms = gen.AndSimp(orderingAxiomBuilder.Axioms, axioms);
  155. return axioms;
  156. }
  157. }
  158. public override string Lookup(VCExprVar var)
  159. {
  160. return exprTranslator.Lookup(var);
  161. }
  162. public override VCExpressionGenerator ExprGen { get {Contract.Ensures(Contract.Result<VCExpressionGenerator>() != null);
  163. return gen;
  164. } }
  165. public override Boogie2VCExprTranslator BoogieExprTranslator { get {Contract.Ensures(Contract.Result<Boogie2VCExprTranslator>() != null);
  166. return translator;
  167. } }
  168. public override VCGenerationOptions VCGenOptions { get {Contract.Ensures(Contract.Result<VCGenerationOptions>() != null);
  169. return genOptions;
  170. } }
  171. }
  172. // Translator from VCExpressions to strings, which are implemented
  173. // by the various provers
  174. [ContractClass(typeof(VCExprTranslatorContracts))]
  175. public abstract class VCExprTranslator : ICloneable {
  176. public abstract string translate(VCExpr expr, int polarity);
  177. public abstract string Lookup(VCExprVar var);
  178. public abstract Object Clone();
  179. }
  180. [ContractClassFor(typeof(VCExprTranslator))]
  181. public abstract class VCExprTranslatorContracts : VCExprTranslator {
  182. public override object Clone() {
  183. Contract.Ensures(Contract.Result<object>() != null);
  184. throw new NotImplementedException();
  185. }
  186. public override string Lookup(VCExprVar var) {
  187. Contract.Requires(var != null);
  188. Contract.Ensures(Contract.Result<string>() != null);
  189. throw new NotImplementedException();
  190. }
  191. public override string translate(VCExpr expr, int polarity) {
  192. Contract.Requires(expr != null);
  193. Contract.Ensures(Contract.Result<string>() != null);
  194. throw new NotImplementedException();
  195. }
  196. }
  197. }