diff --git a/.github/workflows/doc-tests.yml b/.github/workflows/doc-tests.yml index 4ced7b9639..9f6836356e 100644 --- a/.github/workflows/doc-tests.yml +++ b/.github/workflows/doc-tests.yml @@ -10,6 +10,8 @@ on: workflow_dispatch: pull_request: branches: [ master, main-* ] + merge_group: + branches: [ master, main-* ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml index b56811262a..0727bfc0c7 100644 --- a/.github/workflows/jekyll.yml +++ b/.github/workflows/jekyll.yml @@ -37,7 +37,7 @@ jobs: working-directory: 'docs' - name: Setup Pages id: pages - uses: actions/configure-pages@v4 + uses: actions/configure-pages@v5 - name: Build with Jekyll # Outputs to the './_site' directory by default run: (cd docs; bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" --destination ../_site) diff --git a/.github/workflows/msbuild.yml b/.github/workflows/msbuild.yml index dbb4b66a58..22bec32813 100644 --- a/.github/workflows/msbuild.yml +++ b/.github/workflows/msbuild.yml @@ -4,6 +4,8 @@ on: workflow_dispatch: pull_request: branches: [ master, main-* ] + merge_group: + branches: [ master, main-* ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/refman.yml b/.github/workflows/refman.yml index 530c9b01ea..61c315aecd 100644 --- a/.github/workflows/refman.yml +++ b/.github/workflows/refman.yml @@ -4,6 +4,8 @@ on: workflow_dispatch: pull_request: branches: [ master, main-* ] + merge_group: + branches: [ master, main-* ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/runtime-tests.yml b/.github/workflows/runtime-tests.yml index 83f74321d4..0d1d568507 100644 --- a/.github/workflows/runtime-tests.yml +++ b/.github/workflows/runtime-tests.yml @@ -4,6 +4,8 @@ on: workflow_dispatch: pull_request: branches: [ master, main-* ] + merge_group: + branches: [ master, main-* ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/standard-libraries.yml b/.github/workflows/standard-libraries.yml index fb066ce05f..af549732a1 100644 --- a/.github/workflows/standard-libraries.yml +++ b/.github/workflows/standard-libraries.yml @@ -4,6 +4,8 @@ on: workflow_dispatch: pull_request: branches: [ master, main-* ] + merge_group: + branches: [ master, main-* ] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.gitignore b/.gitignore index 874631d595..1efc85789f 100644 --- a/.gitignore +++ b/.gitignore @@ -79,3 +79,5 @@ Source/IntegrationTests/TestFiles/LitTests/LitTest/server/*.bvd /Source/IntegrationTests/TestFiles/LitTests/LitTest/separate-verification/assumptions-lib /Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/log.smt2 /Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/model +Source/IntegrationTests/TestFiles/LitTests/LitTest/logger/*.html +Source/IntegrationTests/TestFiles/LitTests/LitTest/comp/*.html diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7d50d99873..b181dac5d1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -74,7 +74,7 @@ After doing these steps once, for other PRs, one only needs to re-run deep check - If some required tests fail, investigate and push more commits, but know that each CI run takes a lot of time, so try to fix the problem with as few commits as possible (ideally 1) It is also possible you find some tests that fail randomly, in that case, re-run them and report to the team. Avoid using the re-run all failed jobs here, because it will re-run _all_ jobs, so select them individually instead. - Have someone approve the PR and merge it (or auto-merge). -- Once the PR with the fix to the CI is merged to master, go to https://github.com/dafny-lang/dafny/actions/workflows/deep-tests.yml +- Once the PR with the fix to the CI is merged to master, go to https://github.com/dafny-lang/dafny/actions/workflows/nightly-build.yml - Select "Run workflow..." - Select master - Wait for this new run to succeed. @@ -106,4 +106,4 @@ You can find a description of the release process in [docs/dev/RELEASE.md](https Dafny is still changing and backwards incompatible changes may be made. Any backwards compatibility breaking change must be easy to adapt to, such as by adding a command line option. In the future, we plan to add a `dafny migrate` command which should support migrating any Dafny codebase from the previous to the current CLI version. -As rule, Dafny features must be marked as deprecated, including migration instructions, at least one release before they are removed. \ No newline at end of file +As rule, Dafny features must be marked as deprecated, including migration instructions, at least one release before they are removed. diff --git a/Source/DafnyCore/AST/Expressions/Comprehensions/LambdaExpr.cs b/Source/DafnyCore/AST/Expressions/Comprehensions/LambdaExpr.cs index ce4eccd027..add5306ab3 100644 --- a/Source/DafnyCore/AST/Expressions/Comprehensions/LambdaExpr.cs +++ b/Source/DafnyCore/AST/Expressions/Comprehensions/LambdaExpr.cs @@ -3,7 +3,7 @@ namespace Microsoft.Dafny; -public class LambdaExpr : ComprehensionExpr, ICloneable { +public class LambdaExpr : ComprehensionExpr, ICloneable, IFrameScope { public override string WhatKind => Reads.Expressions.Count != 0 ? "lambda" : Range != null ? "partial lambda" : "total lambda"; public Expression Body => Term; @@ -84,4 +84,6 @@ public override bool SetIndent(int indentBefore, TokenNewIndentCollector formatt return true; } + + public string Designator => "lambda"; } \ No newline at end of file diff --git a/Source/DafnyCore/AST/IHasUsages.cs b/Source/DafnyCore/AST/IHasUsages.cs index 47905ba13a..31c31f280a 100644 --- a/Source/DafnyCore/AST/IHasUsages.cs +++ b/Source/DafnyCore/AST/IHasUsages.cs @@ -28,6 +28,10 @@ public interface ICanVerify : ISymbol { string FullDafnyName { get; } } +public interface IFrameScope { + string Designator { get; } // "lambda expression", "method", "function"... +} + public static class AstExtensions { public static string GetMemberQualification(MemberDecl memberDecl) { diff --git a/Source/DafnyCore/AST/Members/ConstantField.cs b/Source/DafnyCore/AST/Members/ConstantField.cs index efc8668ad2..7ec1527960 100644 --- a/Source/DafnyCore/AST/Members/ConstantField.cs +++ b/Source/DafnyCore/AST/Members/ConstantField.cs @@ -65,4 +65,5 @@ public void AutoRevealDependencies(AutoRevealFunctionDependencies Rewriter, Dafn AutoRevealFunctionDependencies.GenerateMessage(addedReveals.ToList())); } } + public string Designator => WhatKind; } \ No newline at end of file diff --git a/Source/DafnyCore/AST/Members/Function.cs b/Source/DafnyCore/AST/Members/Function.cs index 52521ec1fe..84cc33ba36 100644 --- a/Source/DafnyCore/AST/Members/Function.cs +++ b/Source/DafnyCore/AST/Members/Function.cs @@ -564,4 +564,5 @@ public void AutoRevealDependencies(AutoRevealFunctionDependencies Rewriter, Dafn AutoRevealFunctionDependencies.GenerateMessage(addedReveals, autoRevealDepth)); } } + public string Designator => WhatKind; } diff --git a/Source/DafnyCore/AST/Members/ICodeContext.cs b/Source/DafnyCore/AST/Members/ICodeContext.cs index 4d850ab5b8..b314efc9bd 100644 --- a/Source/DafnyCore/AST/Members/ICodeContext.cs +++ b/Source/DafnyCore/AST/Members/ICodeContext.cs @@ -50,7 +50,7 @@ public static ICodeContext Unwrap(ICodeContext codeContext) { /// /// An ICallable is a Function, Method, IteratorDecl, or (less fitting for the name ICallable) RedirectingTypeDecl or DatatypeDecl. /// -public interface ICallable : ICodeContext, ISymbol { +public interface ICallable : ICodeContext, ISymbol, IFrameScope { string WhatKind { get; } string NameRelativeToModule { get; } Specification Decreases { get; } @@ -98,6 +98,8 @@ public bool InferredDecreases { public string GetDescription(DafnyOptions options) { return CwInner.GetDescription(options); } + + public string Designator => WhatKind; } @@ -132,6 +134,7 @@ public IEnumerable GetConcreteChildren() { public string GetDescription(DafnyOptions options) { throw new cce.UnreachableException(); } + public string Designator => WhatKind; } /// diff --git a/Source/DafnyCore/AST/Members/Method.cs b/Source/DafnyCore/AST/Members/Method.cs index cb4134beee..c4937dc3ac 100644 --- a/Source/DafnyCore/AST/Members/Method.cs +++ b/Source/DafnyCore/AST/Members/Method.cs @@ -472,4 +472,5 @@ public void AutoRevealDependencies(AutoRevealFunctionDependencies Rewriter, Dafn AutoRevealFunctionDependencies.GenerateMessage(addedReveals, autoRevealDepth)); } } + public string Designator => WhatKind; } diff --git a/Source/DafnyCore/AST/TypeDeclarations/DatatypeDecl.cs b/Source/DafnyCore/AST/TypeDeclarations/DatatypeDecl.cs index 9a8cd46bb6..b12e70ee97 100644 --- a/Source/DafnyCore/AST/TypeDeclarations/DatatypeDecl.cs +++ b/Source/DafnyCore/AST/TypeDeclarations/DatatypeDecl.cs @@ -196,4 +196,5 @@ public void AutoRevealDependencies(AutoRevealFunctionDependencies Rewriter, Dafn } } } + public string Designator => WhatKind; } \ No newline at end of file diff --git a/Source/DafnyCore/AST/TypeDeclarations/IteratorDecl.cs b/Source/DafnyCore/AST/TypeDeclarations/IteratorDecl.cs index 6898b4b380..93b51ee07c 100644 --- a/Source/DafnyCore/AST/TypeDeclarations/IteratorDecl.cs +++ b/Source/DafnyCore/AST/TypeDeclarations/IteratorDecl.cs @@ -513,4 +513,5 @@ public override string GetTriviaContainingDocstring() { } public bool ShouldVerify => true; // This could be made more accurate public ModuleDefinition ContainingModule => EnclosingModuleDefinition; + public string Designator => WhatKind; } diff --git a/Source/DafnyCore/AST/TypeDeclarations/NewtypeDecl.cs b/Source/DafnyCore/AST/TypeDeclarations/NewtypeDecl.cs index b7fa0f74b7..8d9e9b7414 100644 --- a/Source/DafnyCore/AST/TypeDeclarations/NewtypeDecl.cs +++ b/Source/DafnyCore/AST/TypeDeclarations/NewtypeDecl.cs @@ -166,6 +166,7 @@ public string GetTriviaContainingDocstring() { public ModuleDefinition ContainingModule => EnclosingModuleDefinition; public bool ShouldVerify => true; // This could be made more accurate + public string Designator => WhatKind; } public class NativeType { diff --git a/Source/DafnyCore/AST/TypeDeclarations/TypeSynonymDeclBase.cs b/Source/DafnyCore/AST/TypeDeclarations/TypeSynonymDeclBase.cs index 4bb05afb28..8ce7193f41 100644 --- a/Source/DafnyCore/AST/TypeDeclarations/TypeSynonymDeclBase.cs +++ b/Source/DafnyCore/AST/TypeDeclarations/TypeSynonymDeclBase.cs @@ -125,4 +125,5 @@ public string GetTriviaContainingDocstring() { public abstract SymbolKind Kind { get; } public abstract string GetDescription(DafnyOptions options); + public string Designator => WhatKind; } \ No newline at end of file diff --git a/Source/DafnyCore/AST/Types/UserDefinedType.cs b/Source/DafnyCore/AST/Types/UserDefinedType.cs index aeac33a8b8..04839e2232 100644 --- a/Source/DafnyCore/AST/Types/UserDefinedType.cs +++ b/Source/DafnyCore/AST/Types/UserDefinedType.cs @@ -12,7 +12,7 @@ void ObjectInvariant() { Contract.Invariant(tok != null); Contract.Invariant(Name != null); Contract.Invariant(cce.NonNullElements(TypeArgs)); - Contract.Invariant(NamePath is NameSegment || NamePath is ExprDotName); + Contract.Invariant(NamePath is NameSegment or ExprDotName); Contract.Invariant(!ArrowType.IsArrowTypeName(Name) || this is ArrowType); } diff --git a/Source/DafnyCore/Backends/GoLang/GoCodeGenerator.cs b/Source/DafnyCore/Backends/GoLang/GoCodeGenerator.cs index d001837f05..961ed13aa8 100644 --- a/Source/DafnyCore/Backends/GoLang/GoCodeGenerator.cs +++ b/Source/DafnyCore/Backends/GoLang/GoCodeGenerator.cs @@ -110,8 +110,8 @@ void EmitImports(ConcreteSyntaxTree wr, out ConcreteSyntaxTree importWriter, out } } - public static string TransformToClassName(string baseName) => - Regex.Replace(baseName, "[^_A-Za-z0-9$]", "_"); + public string TransformToClassName(string baseName) => + IdProtect(Regex.Replace(baseName, "[^_A-Za-z0-9$]", "_")); public override void EmitCallToMain(Method mainMethod, string baseName, ConcreteSyntaxTree wr) { var companion = TypeName_Companion(UserDefinedType.FromTopLevelDeclWithAllBooleanTypeParameters(mainMethod.EnclosingClass), wr, mainMethod.tok, mainMethod); @@ -167,11 +167,11 @@ protected override ConcreteSyntaxTree CreateModule(string moduleName, bool isDef return wr; } - var import = CreateImport(moduleName, isDefault, externModule, libraryName); + ModuleName = PublicModuleIdProtect(moduleName); + var import = CreateImport(ModuleName, isDefault, externModule, libraryName); var filename = string.Format("{0}/{0}.go", import.Path); var w = wr.NewFile(filename); - ModuleName = moduleName; EmitModuleHeader(w); AddImport(import); @@ -2519,6 +2519,14 @@ public override string PublicIdProtect(string name) { } } + public string PublicModuleIdProtect(string name) { + if (name == "C") { + return "_C"; + } else { + return name; + } + } + protected override string FullTypeName(UserDefinedType udt, MemberDecl/*?*/ member = null) { return UserDefinedTypeName(udt, full: true, member: member); } @@ -2541,28 +2549,30 @@ private string UserDefinedTypeName(UserDefinedType udt, bool full, MemberDecl/*? } private string UserDefinedTypeName(TopLevelDecl cl, bool full, MemberDecl/*?*/ member = null) { + var enclosingModuleDefinitionId = PublicModuleIdProtect(cl.EnclosingModuleDefinition.GetCompileName(Options)); if (IsExternMemberOfExternModule(member, cl)) { // omit the default class name ("_default") in extern modules, when the class is used to qualify an extern member Contract.Assert(!cl.EnclosingModuleDefinition.IsDefaultModule); // default module is not marked ":extern" - return IdProtect(cl.EnclosingModuleDefinition.GetCompileName(Options)); + return enclosingModuleDefinitionId; } else { if (cl.IsExtern(Options, out var qual, out _)) { // No need to take into account the second argument to extern, since // it'll already be cl.CompileName if (qual == null) { - if (this.ModuleName == cl.EnclosingModuleDefinition.GetCompileName(Options)) { + if (this.ModuleName == enclosingModuleDefinitionId) { qual = ""; } else { - qual = cl.EnclosingModuleDefinition.GetCompileName(Options); + qual = enclosingModuleDefinitionId; } } // Don't use IdName since that'll capitalize, which is unhelpful for // built-in types return qual + (qual == "" ? "" : ".") + cl.GetCompileName(Options); - } else if (!full || cl.EnclosingModuleDefinition.TryToAvoidName || this.ModuleName == cl.EnclosingModuleDefinition.GetCompileName(Options)) { + + } else if (!full || cl.EnclosingModuleDefinition.TryToAvoidName || this.ModuleName == enclosingModuleDefinitionId) { return IdName(cl); } else { - return cl.EnclosingModuleDefinition.GetCompileName(Options) + "." + IdName(cl); + return enclosingModuleDefinitionId + "." + IdName(cl); } } } diff --git a/Source/DafnyCore/Backends/SinglePassCodeGenerator.cs b/Source/DafnyCore/Backends/SinglePassCodeGenerator.cs index 46d6c8caa1..9d65fc8980 100644 --- a/Source/DafnyCore/Backends/SinglePassCodeGenerator.cs +++ b/Source/DafnyCore/Backends/SinglePassCodeGenerator.cs @@ -5571,6 +5571,7 @@ void EmitExpr(Expression e2, ConcreteSyntaxTree wr2, bool inLetExpr, ConcreteSyn var collectionName = ProtectedFreshId("_coll"); var setType = e.Type.NormalizeToAncestorType().AsSetType; var bwr = CreateIIFE0(setType, e.tok, wr, wStmts); + wStmts = bwr.Fork(); wr = bwr; EmitSetBuilder_New(wr, e, collectionName); var n = e.BoundVars.Count; @@ -5617,6 +5618,7 @@ void EmitExpr(Expression e2, ConcreteSyntaxTree wr2, bool inLetExpr, ConcreteSyn var rantypeName = TypeName(mapType.Range, wr, e.tok); var collection_name = ProtectedFreshId("_coll"); var bwr = CreateIIFE0(mapType, e.tok, wr, wStmts); + wStmts = bwr.Fork(); wr = bwr; EmitMapBuilder_New(wr, e, collection_name); var n = e.BoundVars.Count; diff --git a/Source/DafnyCore/DooFile.cs b/Source/DafnyCore/DooFile.cs index 3d31b95d1d..71815f08d3 100644 --- a/Source/DafnyCore/DooFile.cs +++ b/Source/DafnyCore/DooFile.cs @@ -54,7 +54,7 @@ public static ManifestData Read(TextReader reader) { } public void Write(TextWriter writer) { - writer.Write(Toml.FromModel(this, new TomlModelOptions())); + writer.Write(Toml.FromModel(this, new TomlModelOptions()).Replace("\r\n", "\n")); } } @@ -103,7 +103,9 @@ private static DooFile Read(ZipArchive archive) { } public DooFile(Program dafnyProgram) { - var tw = new StringWriter(); + var tw = new StringWriter { + NewLine = "\n" + }; var pr = new Printer(tw, ProgramSerializationOptions, PrintModes.Serialization); // afterResolver is false because we don't yet have a way to safely skip resolution // when reading the program back into memory. @@ -191,7 +193,7 @@ public void Write(ConcreteSyntaxTree wr) { var manifestWr = wr.NewFile(ManifestFileEntry); using var manifestWriter = new StringWriter(); Manifest.Write(manifestWriter); - manifestWr.Write(manifestWriter.ToString()); + manifestWr.Write(manifestWriter.ToString().Replace("\r\n", "\n")); var programTextWr = wr.NewFile(ProgramFileEntry); programTextWr.Write(ProgramText); diff --git a/Source/DafnyCore/Resolver/CheckTypeCharacteristics_Visitor.cs b/Source/DafnyCore/Resolver/CheckTypeCharacteristics_Visitor.cs index c24da14450..c052fb3028 100644 --- a/Source/DafnyCore/Resolver/CheckTypeCharacteristics_Visitor.cs +++ b/Source/DafnyCore/Resolver/CheckTypeCharacteristics_Visitor.cs @@ -257,6 +257,7 @@ bool VisitPattern(CasePattern pat, bool patternGhostContext) { return false; // we've done what there is to be done } else if (expr is DatatypeValue) { var e = (DatatypeValue)expr; + VisitType(expr.tok, expr.Type, inGhostContext); // recursively visit all subexpressions (all actual parameters), noting which ones correspond to ghost formal parameters Contract.Assert(e.Arguments.Count == e.Ctor.Formals.Count); for (var i = 0; i < e.Arguments.Count; i++) { diff --git a/Source/DafnyCore/Resolver/PreType/Flows.cs b/Source/DafnyCore/Resolver/PreType/Flows.cs index 035307ccaa..0dc4d1d0fa 100644 --- a/Source/DafnyCore/Resolver/PreType/Flows.cs +++ b/Source/DafnyCore/Resolver/PreType/Flows.cs @@ -230,15 +230,14 @@ Type JoinChildren(UserDefinedType udtA, UserDefinedType udtB) { var bTypeSubstMap = TypeParameter.SubstitutionMap(bDecl.TypeArgs, b.TypeArgs); (bDecl as TopLevelDeclWithMembers)?.AddParentTypeParameterSubstitutions(bTypeSubstMap); - a = UserDefinedType.FromTopLevelDecl(commonSupertypeDecl.tok, commonSupertypeDecl).Subst(aTypeSubstMap); - b = UserDefinedType.FromTopLevelDecl(commonSupertypeDecl.tok, commonSupertypeDecl).Subst(bTypeSubstMap); + var aSubst = UserDefinedType.FromTopLevelDecl(commonSupertypeDecl.tok, commonSupertypeDecl).Subst(aTypeSubstMap); + var bSubst = UserDefinedType.FromTopLevelDecl(commonSupertypeDecl.tok, commonSupertypeDecl).Subst(bTypeSubstMap); - var joinedTypeArgs = Joins(TypeParameter.Variances(commonSupertypeDecl.TypeArgs), a.TypeArgs, b.TypeArgs, context); + var joinedTypeArgs = Joins(TypeParameter.Variances(commonSupertypeDecl.TypeArgs), aSubst.TypeArgs, bSubst.TypeArgs, context); if (joinedTypeArgs == null) { return null; } - var udt = (UserDefinedType)a; - var result = UserDefinedType.FromTopLevelDecl(udt.tok, commonSupertypeDecl, joinedTypeArgs); + var result = UserDefinedType.FromTopLevelDecl(a.tok, commonSupertypeDecl, joinedTypeArgs); return abNonNullTypes && result.IsRefType ? UserDefinedType.CreateNonNullType(result) : result; } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.BoogieFactory.cs b/Source/DafnyCore/Verifier/BoogieGenerator.BoogieFactory.cs index 36638c1bb9..f707a486cd 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.BoogieFactory.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.BoogieFactory.cs @@ -39,7 +39,7 @@ internal Bpl.Expr BplBvLiteralExpr(Bpl.IToken tok, BaseTypes.BigNum n, int width // Bpl.LiteralExpr for a bitvector. var zero = new Bpl.LiteralExpr(tok, BaseTypes.BigNum.ZERO, width); var absN = new Bpl.LiteralExpr(tok, -n, width); - var etran = new ExpressionTranslator(this, predef, tok); + var etran = new ExpressionTranslator(this, predef, tok, null); return etran.TrToFunctionCall(tok, "sub_bv" + width, BplBvType(width), zero, absN, false); } else { return new Bpl.LiteralExpr(tok, n, width); @@ -628,7 +628,7 @@ public Bpl.Expr ProperPrefix(Bpl.IToken tok, Bpl.Expr e0, Bpl.Expr e1) { Contract.Ensures(Contract.Result() != null); Bpl.Expr len0 = FunctionCall(tok, BuiltinFunction.SeqLength, null, e0); Bpl.Expr len1 = FunctionCall(tok, BuiltinFunction.SeqLength, null, e1); - var result = Bpl.Expr.And( + var result = BplAnd( Bpl.Expr.Lt(len0, len1), FunctionCall(tok, BuiltinFunction.SeqSameUntil, null, e0, e1, len0)); result.tok = tok; @@ -698,10 +698,15 @@ static Bpl.Expr BplAnd(Bpl.Expr a, Bpl.Expr b) { Contract.Requires(b != null); Contract.Ensures(Contract.Result() != null); - if (a == Bpl.Expr.True) { + var aNoLit = RemoveLit(a); + var bNoLit = RemoveLit(b); + + if (aNoLit == Bpl.Expr.True) { return b; - } else if (b == Bpl.Expr.True) { + } else if (bNoLit == Bpl.Expr.True) { return a; + } else if (aNoLit == Bpl.Expr.False || bNoLit == Bpl.Expr.False) { + return Bpl.Expr.False; } else { return Bpl.Expr.Binary(a.tok, Bpl.BinaryOperator.Opcode.And, a, b); } @@ -721,24 +726,42 @@ static Bpl.Expr BplOr(Bpl.Expr a, Bpl.Expr b) { Contract.Requires(b != null); Contract.Ensures(Contract.Result() != null); - if (a == Bpl.Expr.False) { + var aNoLit = RemoveLit(a); + var bNoLit = RemoveLit(b); + + if (aNoLit == Bpl.Expr.False) { return b; - } else if (b == Bpl.Expr.False) { + } else if (bNoLit == Bpl.Expr.False) { return a; + } else if (aNoLit == Bpl.Expr.True) { + return a; + } else if (bNoLit == Bpl.Expr.True) { + return b; } else { return Bpl.Expr.Binary(a.tok, Bpl.BinaryOperator.Opcode.Or, a, b); } } - Bpl.Expr BplIff(Bpl.Expr a, Bpl.Expr b) { + static Bpl.Expr BplIff(Bpl.Expr a, Bpl.Expr b) { Contract.Requires(a != null); Contract.Requires(b != null); Contract.Ensures(Contract.Result() != null); - if (a == Bpl.Expr.True) { + var aNoLit = RemoveLit(a); + var bNoLit = RemoveLit(b); + + if (aNoLit == Bpl.Expr.True) { return b; - } else if (b == Bpl.Expr.True) { + } else if (bNoLit == Bpl.Expr.True) { return a; + } else if (aNoLit == Bpl.Expr.False) { + return Bpl.Expr.Not(b); + } else if (bNoLit == Bpl.Expr.False) { + return Bpl.Expr.Not(a); + } else if (aNoLit == bNoLit) { + return Bpl.Expr.True; + } else if (aNoLit == Bpl.Expr.Not(b) || bNoLit == Bpl.Expr.Not(a)) { + return Bpl.Expr.False; } else { return Bpl.Expr.Iff(a, b); } @@ -749,9 +772,12 @@ static Bpl.Expr BplImp(Bpl.Expr a, Bpl.Expr b) { Contract.Requires(b != null); Contract.Ensures(Contract.Result() != null); - if (a == Bpl.Expr.True || b == Bpl.Expr.True) { + var aNoLit = RemoveLit(a); + var bNoLit = RemoveLit(b); + + if (aNoLit == Bpl.Expr.True || bNoLit == Bpl.Expr.True) { return b; - } else if (a == Bpl.Expr.False) { + } else if (aNoLit == Bpl.Expr.False) { return Bpl.Expr.True; } else { return Bpl.Expr.Imp(a, b); diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.DataTypes.cs b/Source/DafnyCore/Verifier/BoogieGenerator.DataTypes.cs index da34b50da5..57a92cc677 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.DataTypes.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.DataTypes.cs @@ -43,7 +43,7 @@ void AddDatatype(DatatypeDecl dt) { cases_body = BplOr(cases_body, disj); tr = new Bpl.Trigger(ctor.tok, true, new List { disj, isPredicate }, tr); } - var body = Bpl.Expr.Imp(isPredicate, cases_body); + var body = BplImp(isPredicate, cases_body); var ax = BplForall(boundVariables, tr, body); var axiom = new Bpl.Axiom(dt.tok, ax, "Questionmark data type disjunctivity"); sink.AddTopLevelDeclaration(axiom); @@ -124,7 +124,7 @@ private void AddInductiveDatatypeAxioms(Dictionary c eqs = BplAnd(eqs, eq); } - var ax = BplForall(new List { aVar, bVar }, trigger, Bpl.Expr.Imp(ante, Bpl.Expr.Iff(dtEqual, eqs))); + var ax = BplForall(new List { aVar, bVar }, trigger, BplImp(ante, BplIff(dtEqual, eqs))); AddOtherDefinition(constructorFunctions[ctor], new Bpl.Axiom(dt.tok, ax, $"Datatype extensional equality definition: {ctor.FullName}")); } } @@ -143,7 +143,7 @@ private void AddExtensionalityAxiom(IndDatatypeDecl dt) { var lhs = FunctionCall(dt.tok, dtEqualName, Bpl.Type.Bool, a, b); var rhs = Bpl.Expr.Eq(a, b); - var ax = BplForall(new List { aVar, bVar }, BplTrigger(lhs), Bpl.Expr.Iff(lhs, rhs)); + var ax = BplForall(new List { aVar, bVar }, BplTrigger(lhs), BplIff(lhs, rhs)); sink.AddTopLevelDeclaration(new Bpl.Axiom(dt.tok, ax, $"Datatype extensionality axiom: {dt.FullName}")); } } @@ -423,7 +423,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var queryPredicate = FunctionCall(ctor.tok, queryField.Name, Bpl.Type.Bool, th); var ctorId = FunctionCall(ctor.tok, BuiltinFunction.DatatypeCtorId, null, th); var rhs = Bpl.Expr.Eq(ctorId, constructorIdReference); - var body = Bpl.Expr.Iff(queryPredicate, rhs); + var body = BplIff(queryPredicate, rhs); var tr = BplTrigger(queryPredicate); var ax = BplForall(thVar, tr, body); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, ax, "Questionmark and identifier")); @@ -517,7 +517,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, Bpl.Variable iVar = new Bpl.BoundVariable(arg.tok, new Bpl.TypedIdent(arg.tok, "i", Bpl.Type.Int)); bvs.Add(iVar); Bpl.IdentifierExpr ie = new Bpl.IdentifierExpr(arg.tok, iVar); - Bpl.Expr ante = Bpl.Expr.And( + Bpl.Expr ante = BplAnd( Bpl.Expr.Le(Bpl.Expr.Literal(0), ie), Bpl.Expr.Lt(ie, FunctionCall(arg.tok, BuiltinFunction.SeqLength, null, args[i]))); var seqIndex = FunctionCall(arg.tok, BuiltinFunction.SeqIndex, predef.DatatypeType, args[i], ie); @@ -526,7 +526,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var ct = FunctionCall(ctor.tok, ctor.FullName, predef.DatatypeType, args); var rhs = FunctionCall(ctor.tok, BuiltinFunction.DtRank, null, ct); q = new Bpl.ForallExpr(ctor.tok, bvs, new Trigger(lhs.tok, true, new List { seqIndex, ct }), - Bpl.Expr.Imp(ante, Bpl.Expr.Lt(lhs, rhs))); + BplImp(ante, Bpl.Expr.Lt(lhs, rhs))); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, q, "Inductive seq element rank")); } @@ -553,7 +553,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var ct = FunctionCall(ctor.tok, ctor.FullName, predef.DatatypeType, args); var rhs = FunctionCall(ctor.tok, BuiltinFunction.DtRank, null, ct); var trigger = new Bpl.Trigger(ctor.tok, true, new List { inSet, ct }); - q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, Bpl.Expr.Imp(inSet, Bpl.Expr.Lt(lhs, rhs))); + q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, BplImp(inSet, Bpl.Expr.Lt(lhs, rhs))); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, q, "Inductive set element rank")); } else if (argType is MultiSetType) { // axiom (forall params, d: Datatype {arg[d], #dt.ctor(params)} :: 0 < arg[d] ==> DtRank(d) < DtRank(#dt.ctor(params))); @@ -569,7 +569,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var ct = FunctionCall(ctor.tok, ctor.FullName, predef.DatatypeType, args); var rhs = FunctionCall(ctor.tok, BuiltinFunction.DtRank, null, ct); var trigger = new Bpl.Trigger(ctor.tok, true, new List { inMultiset, ct }); - q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, Bpl.Expr.Imp(ante, Bpl.Expr.Lt(lhs, rhs))); + q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, BplImp(ante, Bpl.Expr.Lt(lhs, rhs))); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, q, "Inductive multiset element rank")); } else if (argType is MapType) { var finite = ((MapType)argType).Finite; @@ -589,7 +589,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var ct = FunctionCall(ctor.tok, ctor.FullName, predef.DatatypeType, args); var rhs = FunctionCall(ctor.tok, BuiltinFunction.DtRank, null, ct); var trigger = new Bpl.Trigger(ctor.tok, true, new List { inDomain, ct }); - q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, Bpl.Expr.Imp(inDomain, Bpl.Expr.Lt(lhs, rhs))); + q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, BplImp(inDomain, Bpl.Expr.Lt(lhs, rhs))); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, q, "Inductive map key rank")); } { @@ -613,7 +613,7 @@ private Bpl.Function AddDataTypeConstructor(DatatypeDecl dt, DatatypeCtor ctor, var ct = FunctionCall(ctor.tok, ctor.FullName, predef.DatatypeType, args); var rhs = FunctionCall(ctor.tok, BuiltinFunction.DtRank, null, ct); var trigger = new Bpl.Trigger(ctor.tok, true, new List { inDomain, ct }); - q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, Bpl.Expr.Imp(inDomain, Bpl.Expr.Lt(lhs, rhs))); + q = new Bpl.ForallExpr(ctor.tok, bvs, trigger, BplImp(inDomain, Bpl.Expr.Lt(lhs, rhs))); sink.AddTopLevelDeclaration(new Bpl.Axiom(ctor.tok, q, "Inductive map value rank")); } } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Decreases.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Decreases.cs index 27e0307813..31e18d6bde 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Decreases.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Decreases.cs @@ -82,7 +82,7 @@ void CheckCallTermination(IToken tok, List contextDecreases, List toks, List types0, List types1, // we only need to check lower bound for integers--sets, sequences, booleans, references, and datatypes all have natural lower bounds Bpl.Expr prefixIsLess = Bpl.Expr.False; for (int i = 0; i < k; i++) { - prefixIsLess = Bpl.Expr.Or(prefixIsLess, Less[i]); + prefixIsLess = BplOr(prefixIsLess, Less[i]); }; Bpl.Expr zero = null; @@ -140,9 +140,9 @@ Bpl.Expr DecreasesCheck(List toks, List types0, List types1, if (zero != null) { Bpl.Expr bounded = Bpl.Expr.Le(zero, ee1[k]); for (int i = 0; i < k; i++) { - bounded = Bpl.Expr.Or(bounded, Less[i]); + bounded = BplOr(bounded, Less[i]); } - Bpl.Cmd cmd = Assert(toks[k], Bpl.Expr.Or(bounded, Eq[k]), new PODesc.DecreasesBoundedBelow(N, k, zeroStr, suffixMsg)); + Bpl.Cmd cmd = Assert(toks[k], BplOr(bounded, Eq[k]), new PODesc.DecreasesBoundedBelow(N, k, zeroStr, suffixMsg)); builder.Add(cmd); } } @@ -154,10 +154,10 @@ Bpl.Expr DecreasesCheck(List toks, List types0, List types1, Bpl.Expr eq = Eq[i]; if (allowNoChange) { // decrCheck = atmost && (eq ==> decrCheck) - decrCheck = Bpl.Expr.And(less, Bpl.Expr.Imp(eq, decrCheck)); + decrCheck = BplAnd(less, BplImp(eq, decrCheck)); } else { // decrCheck = less || (eq && decrCheck) - decrCheck = Bpl.Expr.Or(less, Bpl.Expr.And(eq, decrCheck)); + decrCheck = BplOr(less, BplAnd(eq, decrCheck)); } } return decrCheck; @@ -236,9 +236,9 @@ void ComputeLessEq(IToken tok, Type ty0, Type ty1, Bpl.Expr e0, Bpl.Expr e1, out less = Bpl.Expr.Lt(b0, b1); atmost = Bpl.Expr.Le(b0, b1); } else if (ty0 is BoolType) { - eq = Bpl.Expr.Iff(e0, e1); - less = Bpl.Expr.And(Bpl.Expr.Not(e0), e1); - atmost = Bpl.Expr.Imp(e0, e1); + eq = BplIff(e0, e1); + less = BplAnd(Bpl.Expr.Not(e0), e1); + atmost = BplImp(e0, e1); } else if (ty0 is CharType) { eq = Bpl.Expr.Eq(e0, e1); var operand0 = FunctionCall(e0.tok, BuiltinFunction.CharToInt, null, e0); @@ -263,8 +263,8 @@ void ComputeLessEq(IToken tok, Type ty0, Type ty1, Bpl.Expr e0, Bpl.Expr e1, out less = Bpl.Expr.Lt(b0, b1); atmost = Bpl.Expr.Le(b0, b1); if (ty0.IsNumericBased(Type.NumericPersuasion.Int) && includeLowerBound) { - less = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(0), b0), less); - atmost = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(0), b0), atmost); + less = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(0), b0), less); + atmost = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(0), b0), atmost); } } else if (ty0.IsNumericBased(Type.NumericPersuasion.Real)) { @@ -272,8 +272,8 @@ void ComputeLessEq(IToken tok, Type ty0, Type ty1, Bpl.Expr e0, Bpl.Expr e1, out less = Bpl.Expr.Le(e0, Bpl.Expr.Sub(e1, Bpl.Expr.Literal(BaseTypes.BigDec.FromInt(1)))); atmost = Bpl.Expr.Le(e0, e1); if (includeLowerBound) { - less = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(BaseTypes.BigDec.ZERO), e0), less); - atmost = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(BaseTypes.BigDec.ZERO), e0), atmost); + less = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(BaseTypes.BigDec.ZERO), e0), less); + atmost = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(BaseTypes.BigDec.ZERO), e0), atmost); } } else if (ty0 is IteratorDecl.EverIncreasingType) { @@ -342,9 +342,9 @@ void ComputeLessEq(IToken tok, Type ty0, Type ty1, Bpl.Expr e0, Bpl.Expr e1, out Contract.Assert(ty0.IsRefType); // otherwise, unexpected type var b0 = Bpl.Expr.Neq(e0, predef.Null); var b1 = Bpl.Expr.Neq(e1, predef.Null); - eq = Bpl.Expr.Iff(b0, b1); - less = Bpl.Expr.And(Bpl.Expr.Not(b0), b1); - atmost = Bpl.Expr.Imp(b0, b1); + eq = BplIff(b0, b1); + less = BplAnd(Bpl.Expr.Not(b0), b1); + atmost = BplImp(b0, b1); } } } \ No newline at end of file diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.DefiniteAssignment.cs b/Source/DafnyCore/Verifier/BoogieGenerator.DefiniteAssignment.cs index c6ab0be08f..cdb1eb62d1 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.DefiniteAssignment.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.DefiniteAssignment.cs @@ -202,7 +202,7 @@ void AssumeCanCallForByMethodDecl(Method method, BoogieStmtListBuilder builder) // fn == new FunctionCallExpr(tok, f.Name, receiver, tok, tok, f.Formals.ConvertAll(Expression.CreateIdentExpr)); Bpl.IdentifierExpr canCallFuncID = new Bpl.IdentifierExpr(method.tok, method.FullSanitizedName + "#canCall", Bpl.Type.Bool); - var etran = new ExpressionTranslator(this, predef, method.tok); + var etran = new ExpressionTranslator(this, predef, method.tok, method); List args = arguments.Select(arg => etran.TrExpr(arg)).ToList(); var formals = MkTyParamBinders(GetTypeParams(method), out var tyargs); if (method.FunctionFromWhichThisIsByMethodDecl.ReadsHeap) { diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionTranslator.cs b/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionTranslator.cs index 774c86a7b3..dfd0741fcb 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionTranslator.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionTranslator.cs @@ -38,6 +38,7 @@ public Boogie.IdentifierExpr HeapCastToIdentifierExpr { public readonly string This; public readonly string readsFrame; // the name of the context's frame variable for reading state. // May be null to indicate the context's reads frame is * and doesn't require any reads checks. + public readonly IFrameScope scope; // lambda, function or predicate public readonly string modifiesFrame; // the name of the context's frame variable for writing state. readonly Function applyLimited_CurrentFunction; internal readonly FuelSetting layerInterCluster; @@ -64,7 +65,8 @@ void ObjectInvariant() { /// one ExpressionTranslator is constructed from another, unchanged parameters are just copied in. /// ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, string thisVar, - Function applyLimited_CurrentFunction, FuelSetting layerInterCluster, FuelSetting layerIntraCluster, string readsFrame, string modifiesFrame, bool stripLits) { + Function applyLimited_CurrentFunction, FuelSetting layerInterCluster, FuelSetting layerIntraCluster, IFrameScope scope, + string readsFrame, string modifiesFrame, bool stripLits) { Contract.Requires(boogieGenerator != null); Contract.Requires(predef != null); @@ -84,6 +86,7 @@ void ObjectInvariant() { this.layerIntraCluster = layerIntraCluster; } + this.scope = scope; this.readsFrame = readsFrame; this.modifiesFrame = modifiesFrame; this.stripLits = stripLits; @@ -94,48 +97,51 @@ public static Boogie.IdentifierExpr HeapIdentifierExpr(PredefinedDecls predef, B return new Boogie.IdentifierExpr(heapToken, predef.HeapVarName, predef.HeapType); } - public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.IToken heapToken) - : this(boogieGenerator, predef, HeapIdentifierExpr(predef, heapToken)) { + public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.IToken heapToken, IFrameScope scope) + : this(boogieGenerator, predef, HeapIdentifierExpr(predef, heapToken), scope) { Contract.Requires(boogieGenerator != null); Contract.Requires(predef != null); Contract.Requires(heapToken != null); } - public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap) - : this(boogieGenerator, predef, heap, "this") { + public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, IFrameScope scope) + : this(boogieGenerator, predef, heap, scope, "this") { Contract.Requires(boogieGenerator != null); Contract.Requires(predef != null); } - public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, Boogie.Expr oldHeap) - : this(boogieGenerator, predef, heap, "this") { + public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, Boogie.Expr oldHeap, IFrameScope scope) + : this(boogieGenerator, predef, heap, scope, "this") { Contract.Requires(boogieGenerator != null); Contract.Requires(predef != null); Contract.Requires(oldHeap != null); - var old = new ExpressionTranslator(boogieGenerator, predef, oldHeap); + var old = new ExpressionTranslator(boogieGenerator, predef, oldHeap, scope); old.oldEtran = old; this.oldEtran = old; } - public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, string thisVar) - : this(boogieGenerator, predef, heap, thisVar, null, new FuelSetting(boogieGenerator, 1), null, "$_ReadsFrame", "$_ModifiesFrame", false) { + public ExpressionTranslator(BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, IFrameScope scope, string thisVar) + : this(boogieGenerator, predef, heap, thisVar, null, new FuelSetting(boogieGenerator, 1), null, scope, "$_ReadsFrame", "$_ModifiesFrame", false) { Contract.Requires(boogieGenerator != null); Contract.Requires(predef != null); Contract.Requires(thisVar != null); } public ExpressionTranslator(ExpressionTranslator etran, Boogie.Expr heap) - : this(etran.BoogieGenerator, etran.predef, heap, etran.This, etran.applyLimited_CurrentFunction, etran.layerInterCluster, etran.layerIntraCluster, etran.readsFrame, etran.modifiesFrame, etran.stripLits) { + : this(etran.BoogieGenerator, etran.predef, heap, etran.This, etran.applyLimited_CurrentFunction, etran.layerInterCluster, etran.layerIntraCluster, etran.scope, etran.readsFrame, etran.modifiesFrame, etran.stripLits) { Contract.Requires(etran != null); } + public ExpressionTranslator WithReadsFrame(string newReadsFrame, IFrameScope frameScope) { + return new ExpressionTranslator(BoogieGenerator, predef, HeapExpr, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, frameScope, newReadsFrame, modifiesFrame, stripLits); + } public ExpressionTranslator WithReadsFrame(string newReadsFrame) { - return new ExpressionTranslator(BoogieGenerator, predef, HeapExpr, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, newReadsFrame, modifiesFrame, stripLits); + return new ExpressionTranslator(BoogieGenerator, predef, HeapExpr, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, scope, newReadsFrame, modifiesFrame, stripLits); } public ExpressionTranslator WithModifiesFrame(string newModifiesFrame) { - return new ExpressionTranslator(BoogieGenerator, predef, HeapExpr, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, readsFrame, newModifiesFrame, stripLits); + return new ExpressionTranslator(BoogieGenerator, predef, HeapExpr, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, scope, readsFrame, newModifiesFrame, stripLits); } internal IToken GetToken(Expression expression) { @@ -148,7 +154,7 @@ public ExpressionTranslator Old { Contract.Ensures(Contract.Result() != null); if (oldEtran == null) { - oldEtran = new ExpressionTranslator(BoogieGenerator, predef, new Boogie.OldExpr(HeapExpr.tok, HeapExpr), This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, readsFrame, modifiesFrame, stripLits); + oldEtran = new ExpressionTranslator(BoogieGenerator, predef, new Boogie.OldExpr(HeapExpr.tok, HeapExpr), This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, scope, readsFrame, modifiesFrame, stripLits); oldEtran.oldEtran = oldEtran; } return oldEtran; @@ -161,7 +167,7 @@ public ExpressionTranslator OldAt(Label/*?*/ label) { return Old; } var heapAt = new Boogie.IdentifierExpr(Token.NoToken, "$Heap_at_" + label.AssignUniqueId(BoogieGenerator.CurrentIdGenerator), predef.HeapType); - return new ExpressionTranslator(BoogieGenerator, predef, heapAt, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, readsFrame, modifiesFrame, stripLits); + return new ExpressionTranslator(BoogieGenerator, predef, heapAt, This, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, scope, readsFrame, modifiesFrame, stripLits); } public bool UsesOldHeap { @@ -224,9 +230,9 @@ public ExpressionTranslator DecreaseFuel(int offset) { private static ExpressionTranslator CloneExpressionTranslator(ExpressionTranslator orig, BoogieGenerator boogieGenerator, PredefinedDecls predef, Boogie.Expr heap, string thisVar, Function applyLimited_CurrentFunction, FuelSetting layerInterCluster, FuelSetting layerIntraCluster, string readsFrame, string modifiesFrame, bool stripLits) { - var et = new ExpressionTranslator(boogieGenerator, predef, heap, thisVar, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, readsFrame, modifiesFrame, stripLits); + var et = new ExpressionTranslator(boogieGenerator, predef, heap, thisVar, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, orig.scope, readsFrame, modifiesFrame, stripLits); if (orig.oldEtran != null) { - var etOld = new ExpressionTranslator(boogieGenerator, predef, orig.Old.HeapExpr, thisVar, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, readsFrame, modifiesFrame, stripLits); + var etOld = new ExpressionTranslator(boogieGenerator, predef, orig.Old.HeapExpr, thisVar, applyLimited_CurrentFunction, layerInterCluster, layerIntraCluster, orig.scope, readsFrame, modifiesFrame, stripLits); etOld.oldEtran = etOld; et.oldEtran = etOld; } @@ -793,13 +799,13 @@ public Boogie.Expr TrExpr(Expression expr) { Boogie.Expr oInSet = TrInSet(GetToken(opExpr), o, e.E, ((SetType)eeType).Arg, true, out var performedInSetRewrite); Boogie.Expr oNotFresh = OldAt(freshLabel).IsAlloced(GetToken(opExpr), o); Boogie.Expr oIsFresh = Boogie.Expr.Not(oNotFresh); - Boogie.Expr notNullBody = Boogie.Expr.Imp(oInSet, oNotNull); - Boogie.Expr freshBody = Boogie.Expr.Imp(oInSet, oIsFresh); + Boogie.Expr notNullBody = BplImp(oInSet, oNotNull); + Boogie.Expr freshBody = BplImp(oInSet, oIsFresh); var notNullTrigger = BplTrigger(oNotNull); var notNullPred = new Boogie.ForallExpr(GetToken(opExpr), new List { oVar }, notNullTrigger, notNullBody); var freshTrigger = BplTrigger(performedInSetRewrite ? oNotFresh : oInSet); var freshPred = new Boogie.ForallExpr(GetToken(opExpr), new List { oVar }, freshTrigger, freshBody); - return Boogie.Expr.And(notNullPred, freshPred); + return BplAnd(notNullPred, freshPred); } else if (eeType is SeqType) { // generate: (forall $i: int :: 0 <= $i && $i < Seq#Length(X) ==> Unbox(Seq#Index(X,$i)) != null && !old($Heap)[Unbox(Seq#Index(X,$i)),alloc]) Boogie.Variable iVar = new Boogie.BoundVariable(GetToken(opExpr), new Boogie.TypedIdent(GetToken(opExpr), "$i", Boogie.Type.Int)); @@ -810,7 +816,7 @@ public Boogie.Expr TrExpr(Expression expr) { Boogie.Expr oNotFresh = OldAt(freshLabel).IsAlloced(GetToken(opExpr), XsubI); Boogie.Expr oIsFresh = Boogie.Expr.Not(oNotFresh); Boogie.Expr xsubiNotNull = Boogie.Expr.Neq(XsubI, predef.Null); - Boogie.Expr body = Boogie.Expr.Imp(iBounds, Boogie.Expr.And(xsubiNotNull, oIsFresh)); + Boogie.Expr body = BplImp(iBounds, BplAnd(xsubiNotNull, oIsFresh)); //TRIGGERS: Does this make sense? dafny0\SmallTests // BROKEN // NEW_TRIGGER //TRIG (forall $i: int :: 0 <= $i && $i < Seq#Length(Q#0) && $Unbox(Seq#Index(Q#0, $i)): ref != null ==> !read(old($Heap), $Unbox(Seq#Index(Q#0, $i)): ref, alloc)) @@ -1325,10 +1331,10 @@ public Boogie.Expr TrExpr(Expression expr) { Boogie.Expr body = bodyEtran.TrExpr(e.Term); if (e is ForallExpr) { - return new Boogie.ForallExpr(GetToken(quantifierExpr), new List(), bvars, kv, tr, Boogie.Expr.Imp(antecedent, body)); + return new Boogie.ForallExpr(GetToken(quantifierExpr), new List(), bvars, kv, tr, BplImp(antecedent, body)); } else { Contract.Assert(e is ExistsExpr); - return new Boogie.ExistsExpr(GetToken(quantifierExpr), new List(), bvars, kv, tr, Boogie.Expr.And(antecedent, body)); + return new Boogie.ExistsExpr(GetToken(quantifierExpr), new List(), bvars, kv, tr, BplAnd(antecedent, body)); } } } @@ -1360,7 +1366,7 @@ public Boogie.Expr TrExpr(Expression expr) { Boogie.Expr typeAntecedent = TrBoundVariables(e.BoundVars, bvars, false, freeOfAlloc); var eq = Boogie.Expr.Eq(y, BoxIfNecessary(GetToken(comprehension), TrExpr(e.Term), e.Term.Type)); - var ebody = Boogie.Expr.And(BplAnd(typeAntecedent, TrExpr(e.Range)), eq); + var ebody = BplAnd(BplAnd(typeAntecedent, TrExpr(e.Range)), eq); var triggers = BoogieGenerator.TrTrigger(this, e.Attributes, GetToken(e)); lbody = new Boogie.ExistsExpr(GetToken(comprehension), bvars, triggers, ebody); } @@ -1792,11 +1798,11 @@ public Boogie.Expr TrInSet_Aux(IToken tok, Boogie.Expr elmt, Boogie.Expr elmtBox BinaryExpr bin = (BinaryExpr)s; switch (bin.ResolvedOp) { case BinaryExpr.ResolvedOpcode.Union: - return Boogie.Expr.Or(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr)); + return BplOr(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr)); case BinaryExpr.ResolvedOpcode.Intersection: - return Boogie.Expr.And(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr)); + return BplAnd(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr)); case BinaryExpr.ResolvedOpcode.SetDifference: - return Boogie.Expr.And(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), Boogie.Expr.Not(TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr))); + return BplAnd(TrInSet_Aux(tok, elmt, elmtBox, bin.E0, aggressive, out pr), Boogie.Expr.Not(TrInSet_Aux(tok, elmt, elmtBox, bin.E1, aggressive, out pr))); default: break; } @@ -1808,7 +1814,7 @@ public Boogie.Expr TrInSet_Aux(IToken tok, Boogie.Expr elmt, Boogie.Expr elmtBox if (disjunction == null) { disjunction = disjunct; } else { - disjunction = Boogie.Expr.Or(disjunction, disjunct); + disjunction = BplOr(disjunction, disjunct); } } if (disjunction == null) { @@ -1834,7 +1840,7 @@ public Boogie.Expr TrInSet_Aux(IToken tok, Boogie.Expr elmt, Boogie.Expr elmtBox var bvars = new List(); Boogie.Expr typeAntecedent = TrBoundVariables(compr.BoundVars, bvars, false, freeOfAlloc) ?? Boogie.Expr.True; var eq = Boogie.Expr.Eq(elmtBox, BoxIfNecessary(GetToken(compr), TrExpr(compr.Term), compr.Term.Type)); - var ebody = Boogie.Expr.And(BplAnd(typeAntecedent, TrExpr(compr.Range)), eq); + var ebody = BplAnd(BplAnd(typeAntecedent, TrExpr(compr.Range)), eq); var triggers = BoogieGenerator.TrTrigger(this, compr.Attributes, GetToken(compr)); return new Boogie.ExistsExpr(GetToken(compr), bvars, triggers, ebody); } @@ -1885,7 +1891,7 @@ public Boogie.Expr TrInMultiSet_Aux(IToken tok, Boogie.Expr elmt, Boogie.Expr el if (disjunction == null) { disjunction = disjunct; } else { - disjunction = Boogie.Expr.Or(disjunction, disjunct); + disjunction = BplOr(disjunction, disjunct); } } if (disjunction == null) { diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionWellformed.cs b/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionWellformed.cs index e7a4fa6112..96bbfcbaae 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionWellformed.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.ExpressionWellformed.cs @@ -373,9 +373,9 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re } } } - if (!origOptions.LValueContext && wfOptions.DoReadsChecks && e.Member is Field && ((Field)e.Member).IsMutable) { + if (!origOptions.LValueContext && wfOptions.DoReadsChecks && e.Member is Field { IsMutable: true } f) { wfOptions.AssertSink(this, builder)(selectExpr.tok, Bpl.Expr.SelectTok(selectExpr.tok, etran.ReadsFrame(selectExpr.tok), etran.TrExpr(e.Obj), GetField(e)), - new PODesc.FrameSubset("read field", false), wfOptions.AssertKv); + new PODesc.ReadFrameSubset("read field", selectExpr, etran.scope), wfOptions.AssertKv); } break; @@ -430,7 +430,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re i = ConvertExpression(selectExpr.tok, i, e.E0.Type, Type.Int); Bpl.Expr fieldName = FunctionCall(selectExpr.tok, BuiltinFunction.IndexField, null, i); wfOptions.AssertSink(this, builder)(selectExpr.tok, Bpl.Expr.SelectTok(selectExpr.tok, etran.ReadsFrame(selectExpr.tok), seq, fieldName), - new PODesc.FrameSubset("read array element", false), wfOptions.AssertKv); + new PODesc.ReadFrameSubset("read array element", e, etran.scope), wfOptions.AssertKv); } else { Bpl.Expr lowerBound = e.E0 == null ? Bpl.Expr.Literal(0) : etran.TrExpr(e.E0); Contract.Assert(eSeqType.AsArrayType.Dims == 1); @@ -444,7 +444,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re var trigger = BplTrigger(allowedToRead); // Note, the assertion we're about to produce only seems useful in the check-only mode (that is, with subsumption 0), but if it were to be assumed, we'll use this entire RHS as the trigger var qq = new Bpl.ForallExpr(e.tok, new List { iVar }, trigger, BplImp(range, allowedToRead)); wfOptions.AssertSink(this, builder)(selectExpr.tok, qq, - new PODesc.FrameSubset("read the indicated range of array elements", false), + new PODesc.ReadFrameSubset("read the indicated range of array elements", e, etran.scope), wfOptions.AssertKv); } } @@ -474,12 +474,12 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re var tok = idx is IdentifierExpr ? e.tok : idx.tok; // TODO: Reusing the token of an identifier expression would underline its definition. but this is still not perfect. var desc = new PODesc.InRange(e.Array, e.Indices[idxId], true, $"index {idxId}", idxId); - builder.Add(Assert(tok, Bpl.Expr.And(lower, upper), desc, wfOptions.AssertKv)); + builder.Add(Assert(tok, BplAnd(lower, upper), desc, wfOptions.AssertKv)); } if (wfOptions.DoReadsChecks) { Bpl.Expr fieldName = etran.GetArrayIndexFieldName(e.tok, e.Indices); wfOptions.AssertSink(this, builder)(selectExpr.tok, Bpl.Expr.SelectTok(selectExpr.tok, etran.ReadsFrame(selectExpr.tok), array, fieldName), - new PODesc.FrameSubset("read array element", false), wfOptions.AssertKv); + new PODesc.ReadFrameSubset("read array element", selectExpr, etran.scope), wfOptions.AssertKv); } break; @@ -600,7 +600,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re objset); var reads = new FrameExpression(e.tok, wrap, null); CheckFrameSubset(applyExpr.tok, new List { reads }, null, null, - etran, etran.ReadsFrame(applyExpr.tok), wfOptions.AssertSink(this, builder), new PODesc.FrameSubset("invoke function", false), wfOptions.AssertKv); + etran, etran.ReadsFrame(applyExpr.tok), wfOptions.AssertSink(this, builder), new PODesc.ReadFrameSubset("invoke function"), wfOptions.AssertKv); } break; @@ -736,7 +736,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re objset); var reads = new FrameExpression(expr.tok, wrap, null); CheckFrameSubset(expr.tok, new List { reads }, null, null, - etran, etran.ReadsFrame(expr.tok), wfOptions.AssertSink(this, builder), new PODesc.FrameSubset("invoke function", false), wfOptions.AssertKv); + etran, etran.ReadsFrame(expr.tok), wfOptions.AssertSink(this, builder), new PODesc.ReadFrameSubset("invoke function"), wfOptions.AssertKv); } } else { @@ -766,7 +766,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re var s = new Substituter(null, new Dictionary(), e.GetTypeArgumentSubstitutions()); CheckFrameSubset(callExpr.tok, e.Function.Reads.Expressions.ConvertAll(s.SubstFrameExpr), - e.Receiver, substMap, etran, etran.ReadsFrame(callExpr.tok), wfOptions.AssertSink(this, builder), new PODesc.FrameSubset("invoke function", false), wfOptions.AssertKv); + e.Receiver, substMap, etran, etran.ReadsFrame(callExpr.tok), wfOptions.AssertSink(this, builder), new PODesc.ReadFrameSubset("invoke function"), wfOptions.AssertKv); } } Bpl.Expr allowance = null; @@ -829,7 +829,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re Bpl.IdentifierExpr canCallFuncID = new Bpl.IdentifierExpr(callExpr.tok, e.Function.FullSanitizedName + "#canCall", Bpl.Type.Bool); List args = etran.FunctionInvocationArguments(e, null, null); Bpl.Expr canCallFuncAppl = new Bpl.NAryExpr(GetToken(expr), new Bpl.FunctionCall(canCallFuncID), args); - builder.Add(TrAssumeCmd(callExpr.tok, allowance == null ? canCallFuncAppl : Bpl.Expr.Or(allowance, canCallFuncAppl))); + builder.Add(TrAssumeCmd(callExpr.tok, allowance == null ? canCallFuncAppl : BplOr(allowance, canCallFuncAppl))); var returnType = e.Type.AsDatatype; if (returnType != null && returnType.Ctors.Count == 1) { @@ -892,7 +892,7 @@ void CheckWellformedWithResult(Expression expr, WFOptions wfOptions, Bpl.Expr re CheckFrameSubset(fe.E.tok, new List() { fe }, null, new Dictionary(), etran, etran.ReadsFrame(fe.E.tok), wfOptions.AssertSink(this, builder), - new PODesc.FrameSubset($"read state of 'unchanged' {description}", false), wfOptions.AssertKv); + new PODesc.ReadFrameSubset($"read state of 'unchanged' {description}"), wfOptions.AssertKv); } } @@ -1098,7 +1098,7 @@ void CheckOperand(Expression operand) { // Set up a new frame var frameName = CurrentIdGenerator.FreshId("$_Frame#l"); reads = lam.Reads.Expressions.ConvertAll(s.SubstFrameExpr); - comprehensionEtran = comprehensionEtran.WithReadsFrame(frameName); + comprehensionEtran = comprehensionEtran.WithReadsFrame(frameName, lam); DefineFrame(e.tok, comprehensionEtran.ReadsFrame(e.tok), reads, newBuilder, locals, frameName, comprehensionEtran); // Check frame WF and that it read covers itself @@ -1343,7 +1343,7 @@ void BuildWithHeapAs(IToken token, Bpl.Expr temporaryHeap, string heapVarSuffix, var tmpHeapVar = new Bpl.LocalVariable(token, new Bpl.TypedIdent(token, "Heap$" + suffix, predef.HeapType)); locals.Add(tmpHeapVar); var tmpHeap = new Bpl.IdentifierExpr(token, tmpHeapVar); - var generalEtran = new ExpressionTranslator(this, predef, token); + var generalEtran = new ExpressionTranslator(this, predef, token, null); var theHeap = generalEtran.HeapCastToIdentifierExpr; // tmpHeap := $Heap; @@ -1533,7 +1533,7 @@ private void CheckElementInit(IToken tok, bool forArray, List dims, indices.ConvertAll(idx => (Bpl.Expr)FunctionCall(tok, BuiltinFunction.Box, null, idx)))))); // check precond var pre = FunctionCall(tok, Requires(dims.Count), Bpl.Type.Bool, args); - var q = new Bpl.ForallExpr(tok, bvs, Bpl.Expr.Imp(ante, pre)); + var q = new Bpl.ForallExpr(tok, bvs, BplImp(ante, pre)); var desc = new PODesc.IndicesInDomain(forArray ? "array" : "sequence"); builder.Add(AssertNS(tok, q, desc)); if (!forArray && options.DoReadsChecks) { @@ -1544,12 +1544,12 @@ private void CheckElementInit(IToken tok, bool forArray, List dims, objset); var reads = new FrameExpression(tok, wrap, null); Action maker = (t, e, d, qk) => { - var qe = new Bpl.ForallExpr(t, bvs, Bpl.Expr.Imp(ante, e)); + var qe = new Bpl.ForallExpr(t, bvs, BplImp(ante, e)); options.AssertSink(this, builder)(t, qe, d, qk); }; CheckFrameSubset(tok, new List { reads }, null, null, etran, etran.ReadsFrame(tok), maker, - new PODesc.FrameSubset("invoke the function passed as an argument to the sequence constructor", false), + new PODesc.ReadFrameSubset("invoke the function passed as an argument to the sequence constructor"), options.AssertKv); } // Check that the values coming out of the function satisfy any appropriate subset-type constraints @@ -1558,7 +1558,7 @@ private void CheckElementInit(IToken tok, bool forArray, List dims, if (cre != null) { // assert (forall i0,i1,i2,... :: // 0 <= i0 < ... && ... ==> init.requires(i0,i1,i2,...) is Subtype); - q = new Bpl.ForallExpr(tok, bvs, Bpl.Expr.Imp(ante, cre)); + q = new Bpl.ForallExpr(tok, bvs, BplImp(ante, cre)); builder.Add(AssertNS(init.tok, q, subrangeDesc)); } @@ -1570,7 +1570,7 @@ private void CheckElementInit(IToken tok, bool forArray, List dims, var ai_prime = UnboxUnlessBoxType(tok, ai, elementType); var tr = new Bpl.Trigger(tok, true, new List { ai }); q = new Bpl.ForallExpr(tok, bvs, tr, - Bpl.Expr.Imp(ante, Bpl.Expr.Eq(ai_prime, apply))); // TODO: use a more general Equality translation + BplImp(ante, Bpl.Expr.Eq(ai_prime, apply))); // TODO: use a more general Equality translation builder.Add(new Bpl.AssumeCmd(tok, q)); } } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Extremes.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Extremes.cs index 8670f4a46e..54ffaa66ce 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Extremes.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Extremes.cs @@ -53,7 +53,7 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { Contract.Requires(predef != null); var co = pp.ExtremePred; var tok = pp.tok; - var etran = new ExpressionTranslator(this, predef, tok); + var etran = new ExpressionTranslator(this, predef, tok, pp); var tyvars = MkTyParamBinders(GetTypeParams(pp), out var tyexprs); @@ -102,10 +102,10 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { prefixArgsLimitedM.Add(bvThisIdExpr); // add well-typedness conjunct to antecedent Type thisType = ModuleResolver.GetReceiverType(tok, pp); - Bpl.Expr wh = Bpl.Expr.And( + Bpl.Expr wh = BplAnd( ReceiverNotNull(bvThisIdExpr), GetWhereClause(tok, bvThisIdExpr, thisType, etran, NOALLOC)); - ante = Bpl.Expr.And(ante, wh); + ante = BplAnd(ante, wh); } Bpl.Expr kWhere = null, kId = null, mId = null; @@ -143,7 +143,7 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { bvs.Add(bv); if (wh != null) { // add well-typedness conjunct to antecedent - ante = Bpl.Expr.And(ante, wh); + ante = BplAnd(ante, wh); } } } @@ -166,12 +166,12 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { kWhere == null ? prefixAppl : BplAnd(kWhere, prefixAppl)); tr = BplTriggerHeap(this, tok, coAppl, pp.ReadsHeap ? null : h); var allS = new Bpl.ForallExpr(tok, bvs, tr, BplImp(BplAnd(ante, coAppl), qqqK)); - sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, Bpl.Expr.Imp(activation, allS), + sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, BplImp(activation, allS), "1st prefix predicate axiom for " + pp.FullSanitizedName)); // forall args :: { P(args) } args-have-appropriate-values && (QQQ k :: 0 ATMOST k HHH P#[k](args)) ==> P(args) allS = new Bpl.ForallExpr(tok, bvs, tr, BplImp(BplAnd(ante, qqqK), coAppl)); - sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, Bpl.Expr.Imp(activation, allS), + sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, BplImp(activation, allS), "2nd prefix predicate axiom")); // forall args,k :: args-have-appropriate-values && k == 0 ==> NNN P#0#[k](args) @@ -188,7 +188,7 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { var trigger = BplTriggerHeap(this, prefixLimitedBody.tok, prefixLimitedBody, pp.ReadsHeap ? null : h); var trueAtZero = new Bpl.ForallExpr(tok, moreBvs, trigger, BplImp(BplAnd(ante, z), prefixLimited)); - sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, Bpl.Expr.Imp(activation, trueAtZero), + sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, BplImp(activation, trueAtZero), "3rd prefix predicate axiom")); #if WILLING_TO_TAKE_THE_PERFORMANCE_HIT @@ -211,7 +211,7 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { var trigger2 = new Bpl.Trigger(tok, true, new List { prefixPred_K, prefixPred_M }); var monotonicity = new Bpl.ForallExpr(tok, moreBvs, trigger2, BplImp(smaller, direction)); - AddRootAxiom(new Bpl.Axiom(tok, Bpl.Expr.Imp(activation, monotonicity), + AddRootAxiom(new Bpl.Axiom(tok, BplImp(activation, monotonicity), "prefix predicate monotonicity axiom")); #endif // A more targeted monotonicity axiom used to increase the power of automation for proving the limit case for @@ -237,7 +237,7 @@ void AddPrefixPredicateAxioms(PrefixPredicate pp) { var trigger3 = new Bpl.Trigger(tok, true, new List { prefixPred_K, kLessLimit, mLessLimit }); var monotonicity = new Bpl.ForallExpr(tok, moreBvs, trigger3, BplImp(kLessM, direction)); - sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, Bpl.Expr.Imp(activation, monotonicity), + sink.AddTopLevelDeclaration(new Bpl.Axiom(tok, BplImp(activation, monotonicity), "targeted prefix predicate monotonicity axiom")); } } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Fields.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Fields.cs index 7ee312b18f..02a5d556ff 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Fields.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Fields.cs @@ -34,9 +34,9 @@ Bpl.Constant GetField(Field f) { // !$IsGhostField(f); // if the field is not a ghost field Bpl.Expr fdim = Bpl.Expr.Eq(FunctionCall(f.tok, BuiltinFunction.FDim, ty, Bpl.Expr.Ident(fc)), Bpl.Expr.Literal(0)); Bpl.Expr declType = Bpl.Expr.Eq(FunctionCall(f.tok, BuiltinFunction.FieldOfDecl, ty, new Bpl.IdentifierExpr(f.tok, GetClass(cce.NonNull(f.EnclosingClass))), new Bpl.IdentifierExpr(f.tok, GetFieldNameFamily(f.Name))), Bpl.Expr.Ident(fc)); - Bpl.Expr cond = Bpl.Expr.And(fdim, declType); + Bpl.Expr cond = BplAnd(fdim, declType); var ig = FunctionCall(f.tok, BuiltinFunction.IsGhostField, ty, Bpl.Expr.Ident(fc)); - cond = Bpl.Expr.And(cond, f.IsGhost ? ig : Bpl.Expr.Not(ig)); + cond = BplAnd(cond, f.IsGhost ? ig : Bpl.Expr.Not(ig)); Bpl.Axiom ax = new Bpl.Axiom(f.tok, cond); AddOtherDefinition(fc, ax); } @@ -117,7 +117,7 @@ Bpl.Function GetReadonlyField(Field f) { // function QQ():int { 3 } var cf = (ConstantField)f; if (cf.Rhs != null && RevealedInScope(cf)) { - var etran = new ExpressionTranslator(this, predef, NewOneHeapExpr(f.tok)); + var etran = new ExpressionTranslator(this, predef, NewOneHeapExpr(f.tok), null); if (!IsOpaque(cf)) { sink.AddTopLevelDeclaration(ff.CreateDefinitionAxiom(etran.TrExpr(cf.Rhs))); } @@ -167,7 +167,7 @@ void AddWellformednessCheck(ConstantField decl) { currentModule = decl.EnclosingModule; codeContext = decl; fuelContext = FuelSetting.NewFuelContext(decl); - var etran = new ExpressionTranslator(this, predef, decl.tok); + var etran = new ExpressionTranslator(this, predef, decl.tok, null); // parameters of the procedure List inParams = MkTyParamFormals(GetTypeParams(decl.EnclosingClass), true); @@ -176,7 +176,7 @@ void AddWellformednessCheck(ConstantField decl) { Contract.Assert(VisibleInScope(receiverType)); var th = new Bpl.IdentifierExpr(decl.tok, "this", TrReceiverType(decl)); - var wh = Bpl.Expr.And( + var wh = BplAnd( ReceiverNotNull(th), etran.GoodRef(decl.tok, th, receiverType)); // for class constructors, the receiver is encoded as an output parameter diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Functions.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Functions.cs index 0b7db48a7e..0fe86915b1 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Functions.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Functions.cs @@ -28,7 +28,7 @@ void AddWellformednessCheck(Function f) { Bpl.Expr prevHeap = null; Bpl.Expr currHeap = null; - var ordinaryEtran = new ExpressionTranslator(this, predef, f.tok); + var ordinaryEtran = new ExpressionTranslator(this, predef, f.tok, f); ExpressionTranslator etran; var inParams_Heap = new List(); if (f is TwoStateFunction) { @@ -38,7 +38,7 @@ void AddWellformednessCheck(Function f) { inParams_Heap.Add(currHeapVar); prevHeap = new Bpl.IdentifierExpr(f.tok, prevHeapVar); currHeap = new Bpl.IdentifierExpr(f.tok, currHeapVar); - etran = new ExpressionTranslator(this, predef, currHeap, prevHeap); + etran = new ExpressionTranslator(this, predef, currHeap, prevHeap, f); } else { etran = ordinaryEtran; } @@ -49,7 +49,7 @@ void AddWellformednessCheck(Function f) { var outParams = new List(); if (!f.IsStatic) { var th = new Bpl.IdentifierExpr(f.tok, "this", TrReceiverType(f)); - Bpl.Expr wh = Bpl.Expr.And( + Bpl.Expr wh = BplAnd( ReceiverNotNull(th), (f is TwoStateFunction ? etran.Old : etran).GoodRef(f.tok, th, ModuleResolver.GetReceiverType(f.tok, f))); Bpl.Formal thVar = new Bpl.Formal(f.tok, new Bpl.TypedIdent(f.tok, "this", TrReceiverType(f), wh), true); @@ -133,7 +133,7 @@ void AddWellformednessCheck(Function f) { delayer.DoWithDelayedReadsChecks(true, wfo => { foreach (var formal in f.Formals.Where(formal => formal.DefaultValue != null)) { var e = formal.DefaultValue; - CheckWellformed(e, wfo, locals, builder, etran); + CheckWellformed(e, wfo, locals, builder, etran.WithReadsFrame(etran.readsFrame, null)); // No frame scope for default values builder.Add(new Bpl.AssumeCmd(e.tok, etran.CanCallAssumption(e))); CheckSubrange(e.tok, etran.TrExpr(e), e.Type, formal.Type, builder); @@ -360,11 +360,11 @@ void AddFunctionConsequenceAxiom(Boogie.Function boogieFunction, Function f, Lis bvPrevHeap = new Bpl.BoundVariable(f.tok, new Bpl.TypedIdent(f.tok, "$prevHeap", predef.HeapType)); etran = new ExpressionTranslator(this, predef, f.ReadsHeap ? new Bpl.IdentifierExpr(f.tok, predef.HeapVarName, predef.HeapType) : null, - new Bpl.IdentifierExpr(f.tok, bvPrevHeap)); + new Bpl.IdentifierExpr(f.tok, bvPrevHeap), f); etranHeap = etran; } else { - etranHeap = new ExpressionTranslator(this, predef, f.tok); - etran = readsHeap ? etranHeap : new ExpressionTranslator(this, predef, (Bpl.Expr)null); + etranHeap = new ExpressionTranslator(this, predef, f.tok, f); + etran = readsHeap ? etranHeap : new ExpressionTranslator(this, predef, (Bpl.Expr)null, f); } // This method generate the Consequence Axiom, which has information about the function's @@ -460,7 +460,7 @@ void AddFunctionConsequenceAxiom(Boogie.Function boogieFunction, Function f, Lis args.Add(bvThisIdExpr); // add well-typedness conjunct to antecedent Type thisType = ModuleResolver.GetReceiverType(f.tok, f); - Bpl.Expr wh = Bpl.Expr.And( + Bpl.Expr wh = BplAnd( ReceiverNotNull(bvThisIdExpr), (f is TwoStateFunction ? etran.Old : etran).GoodRef(f.tok, bvThisIdExpr, thisType)); ante = BplAnd(ante, wh); @@ -521,8 +521,8 @@ void AddFunctionConsequenceAxiom(Boogie.Function boogieFunction, Function f, Lis Bpl.Expr useViaCanCall = new Bpl.NAryExpr(f.tok, new Bpl.FunctionCall(canCallFuncID), Concat(tyargs, args)); // ante := useViaCanCall || (useViaContext && typeAnte && pre) - ante = Bpl.Expr.Or(useViaCanCall, BplAnd(useViaContext, BplAnd(ante, pre))); - anteIsAlloc = Bpl.Expr.Or(useViaCanCall, BplAnd(useViaContext, BplAnd(anteIsAlloc, pre))); + ante = BplOr(useViaCanCall, BplAnd(useViaContext, BplAnd(ante, pre))); + anteIsAlloc = BplOr(useViaCanCall, BplAnd(useViaContext, BplAnd(anteIsAlloc, pre))); Bpl.Trigger tr = BplTriggerHeap(this, f.tok, funcAppl, (f.ReadsHeap || !readsHeap) ? null : etran.HeapExpr); @@ -541,13 +541,17 @@ void AddFunctionConsequenceAxiom(Boogie.Function boogieFunction, Function f, Lis post = BplAnd(post, olderCondition); } Bpl.Expr whr = GetWhereClause(f.tok, funcAppl, f.ResultType, etran, NOALLOC); - if (whr != null) { post = Bpl.Expr.And(post, whr); } + if (whr != null) { post = BplAnd(post, whr); } - Bpl.Expr ax = BplForall(f.tok, new List(), formals, null, tr, Bpl.Expr.Imp(ante, post)); + Bpl.Expr axBody = BplImp(ante, post); + Bpl.Expr ax = BplForall(f.tok, new List(), formals, null, tr, axBody); var activate = AxiomActivation(f, etran); string comment = "consequence axiom for " + f.FullSanitizedName; - var consequenceAxiom = new Bpl.Axiom(f.tok, Bpl.Expr.Imp(activate, ax), comment); - AddOtherDefinition(boogieFunction, consequenceAxiom); + if (RemoveLit(axBody) != Bpl.Expr.True) { + var consequenceExpr = BplImp(activate, ax); + var consequenceAxiom = new Bpl.Axiom(f.tok, consequenceExpr, comment); + AddOtherDefinition(boogieFunction, consequenceAxiom); + } if (f.ResultType.MayInvolveReferences) { whr = GetWhereClause(f.tok, funcAppl, f.ResultType, etranHeap, ISALLOC, true); @@ -560,11 +564,14 @@ void AddFunctionConsequenceAxiom(Boogie.Function boogieFunction, Function f, Lis anteIsAlloc = BplAnd(anteIsAlloc, goodHeap); } - ax = BplForall(f.tok, new List(), formals, null, BplTrigger(whr), Bpl.Expr.Imp(anteIsAlloc, whr)); + axBody = BplImp(anteIsAlloc, whr); + ax = BplForall(f.tok, new List(), formals, null, BplTrigger(whr), axBody); - comment = "alloc consequence axiom for " + f.FullSanitizedName; - var allocConsequenceAxiom = new Bpl.Axiom(f.tok, Bpl.Expr.Imp(activate, ax), comment); - AddOtherDefinition(boogieFunction, allocConsequenceAxiom); + if (RemoveLit(axBody) != Bpl.Expr.True) { + comment = "alloc consequence axiom for " + f.FullSanitizedName; + var allocConsequenceAxiom = new Bpl.Axiom(f.tok, BplImp(activate, ax), comment); + AddOtherDefinition(boogieFunction, allocConsequenceAxiom); + } } } } @@ -646,11 +653,11 @@ private Axiom GetFunctionAxiom(Function f, Expression body, List lits) { bvPrevHeap = new Bpl.BoundVariable(f.tok, new Bpl.TypedIdent(f.tok, "$prevHeap", predef.HeapType)); etran = new ExpressionTranslator(this, predef, f.ReadsHeap ? new Bpl.IdentifierExpr(f.tok, predef.HeapVarName, predef.HeapType) : null, - new Bpl.IdentifierExpr(f.tok, bvPrevHeap)); + new Bpl.IdentifierExpr(f.tok, bvPrevHeap), f); } else { etran = readsHeap - ? new ExpressionTranslator(this, predef, f.tok) - : new ExpressionTranslator(this, predef, (Bpl.Expr)null); + ? new ExpressionTranslator(this, predef, f.tok, f) + : new ExpressionTranslator(this, predef, (Bpl.Expr)null, f); } // quantify over the type arguments, and add them first to the arguments @@ -735,7 +742,7 @@ private Axiom GetFunctionAxiom(Function f, Expression body, List lits) { // add well-typedness conjunct to antecedent Type thisType = ModuleResolver.GetReceiverType(f.tok, f); - Bpl.Expr wh = Bpl.Expr.And( + Bpl.Expr wh = BplAnd( ReceiverNotNull(bvThisIdExpr), (f is TwoStateFunction ? etran.Old : etran).GoodRef(f.tok, bvThisIdExpr, thisType)); ante = BplAnd(ante, wh); @@ -831,7 +838,7 @@ private Axiom GetFunctionAxiom(Function f, Expression body, List lits) { Bpl.Expr useViaCanCall = new Bpl.NAryExpr(f.tok, new Bpl.FunctionCall(canCallFuncID), Concat(tyargs, args)); // ante := useViaCanCall || (useViaContext && typeAnte && pre) - ante = Bpl.Expr.Or(useViaCanCall, ante); + ante = BplOr(useViaCanCall, ante); Bpl.Expr funcAppl; { @@ -887,7 +894,7 @@ private Axiom GetFunctionAxiom(Function f, Expression body, List lits) { } Bpl.Expr ax = BplForall(f.tok, new List(), forallFormals, kv, tr, - Bpl.Expr.Imp(ante, tastyVegetarianOption)); + BplImp(ante, tastyVegetarianOption)); var activate = AxiomActivation(f, etran); string comment; comment = "definition axiom for " + f.FullSanitizedName; @@ -904,7 +911,7 @@ private Axiom GetFunctionAxiom(Function f, Expression body, List lits) { } else { comment += " (opaque)"; } - return new Axiom(f.tok, Bpl.Expr.Imp(activate, ax), comment); + return new Axiom(f.tok, BplImp(activate, ax), comment); } @@ -1106,14 +1113,14 @@ public string FunctionHandle(Function f) { Bpl.Expr unboxBx = FunctionCall(f.tok, BuiltinFunction.Unbox, predef.RefType, bx); Bpl.Expr lhs = Bpl.Expr.SelectTok(f.tok, lhs_inner, bx); - var et = new ExpressionTranslator(this, predef, h); + var et = new ExpressionTranslator(this, predef, h, f); var rhs = InRWClause_Aux(f.tok, unboxBx, bx, null, f.Reads.Expressions, false, et, selfExpr, rhs_dict); if (f.EnclosingClass is ArrowTypeDecl) { var args_h = f.ReadsHeap ? Snoc(SnocPrevH(argsRequires), h) : argsRequires; var precondition = FunctionCall(f.tok, Requires(arity), Bpl.Type.Bool, Concat(SnocSelf(args_h), lhs_args)); sink.AddTopLevelDeclaration(new Axiom(f.tok, - BplForall(Cons(bxVar, Concat(vars, bvars)), BplTrigger(lhs), Bpl.Expr.Imp(precondition, Bpl.Expr.Eq(lhs, rhs))))); + BplForall(Cons(bxVar, Concat(vars, bvars)), BplTrigger(lhs), BplImp(precondition, Bpl.Expr.Eq(lhs, rhs))))); } else { sink.AddTopLevelDeclaration(new Axiom(f.tok, BplForall(Cons(bxVar, Concat(vars, bvars)), BplTrigger(lhs), Bpl.Expr.Eq(lhs, rhs)))); @@ -1182,10 +1189,10 @@ void AddFrameAxiom(Function f) { Bpl.Expr h0; var h0Var = BplBoundVar("$h0", predef.HeapType, out h0); Bpl.Expr h1; var h1Var = BplBoundVar("$h1", predef.HeapType, out h1); - var etran0 = new ExpressionTranslator(this, predef, h0); - var etran1 = new ExpressionTranslator(this, predef, h1); + var etran0 = new ExpressionTranslator(this, predef, h0, f); + var etran1 = new ExpressionTranslator(this, predef, h1, f); - Bpl.Expr wellFormed = Bpl.Expr.And( + Bpl.Expr wellFormed = BplAnd( FunctionCall(f.tok, BuiltinFunction.IsGoodHeap, null, etran0.HeapExpr), FunctionCall(f.tok, BuiltinFunction.IsGoodHeap, null, etran1.HeapExpr)); @@ -1199,7 +1206,7 @@ void AddFrameAxiom(Function f) { Bpl.Expr heapSucc = HeapSucc(h0, h1); Bpl.Expr r0 = InRWClause(f.tok, o, field, f.Reads.Expressions, etran0, null, null); Bpl.Expr q0 = new Bpl.ForallExpr(f.tok, new List { }, new List { oVar, fieldVar }, - Bpl.Expr.Imp(Bpl.Expr.And(oNotNullAlloced, r0), unchanged)); + BplImp(BplAnd(oNotNullAlloced, r0), unchanged)); List tyexprs; var bvars = MkTyParamBinders(GetTypeParams(f), out tyexprs); @@ -1232,8 +1239,8 @@ void AddFrameAxiom(Function f) { f0args.Add(th); f1args.Add(th); f0argsCanCall.Add(th); f1argsCanCall.Add(th); Type thisType = ModuleResolver.GetReceiverType(f.tok, f); - Bpl.Expr wh = Bpl.Expr.And(ReceiverNotNull(th), GetWhereClause(f.tok, th, thisType, etran0, useAlloc)); - wellFormed = Bpl.Expr.And(wellFormed, wh); + Bpl.Expr wh = BplAnd(ReceiverNotNull(th), GetWhereClause(f.tok, th, thisType, etran0, useAlloc)); + wellFormed = BplAnd(wellFormed, wh); } // (formalsAreWellFormed[h0] || canCallF(h0,...)) && (formalsAreWellFormed[h1] || canCallF(h1,...)) @@ -1245,19 +1252,19 @@ void AddFrameAxiom(Function f) { Bpl.Expr formal = new Bpl.IdentifierExpr(p.tok, bv); f0args.Add(formal); f1args.Add(formal); f0argsCanCall.Add(formal); f1argsCanCall.Add(formal); Bpl.Expr wh = GetWhereClause(p.tok, formal, p.Type, etran0, useAlloc); - if (wh != null) { fwf0 = Bpl.Expr.And(fwf0, wh); } + if (wh != null) { fwf0 = BplAnd(fwf0, wh); } } var canCall = new Bpl.FunctionCall(new Bpl.IdentifierExpr(f.tok, f.FullSanitizedName + "#canCall", Bpl.Type.Bool)); - wellFormed = Bpl.Expr.And(wellFormed, Bpl.Expr.And( - Bpl.Expr.Or(new Bpl.NAryExpr(f.tok, canCall, f0argsCanCall), fwf0), - Bpl.Expr.Or(new Bpl.NAryExpr(f.tok, canCall, f1argsCanCall), fwf1))); + wellFormed = BplAnd(wellFormed, BplAnd( + BplOr(new Bpl.NAryExpr(f.tok, canCall, f0argsCanCall), fwf0), + BplOr(new Bpl.NAryExpr(f.tok, canCall, f1argsCanCall), fwf1))); /* DR: I conjecture that this should be enough, as the requires is preserved when the frame is: - wellFormed = Bpl.Expr.And(wellFormed, - Bpl.Expr.Or(new Bpl.NAryExpr(f.tok, canCall, f0argsCanCall), fwf0)); + wellFormed = BplAnd(wellFormed, + BplOr(new Bpl.NAryExpr(f.tok, canCall, f0argsCanCall), fwf0)); */ var fn = new Bpl.FunctionCall(new Bpl.IdentifierExpr(f.tok, f.FullSanitizedName, TrType(f.ResultType))); @@ -1267,8 +1274,8 @@ void AddFrameAxiom(Function f) { var tr = new Bpl.Trigger(f.tok, true, new List { h0IsHeapAnchor, heapSucc, F1 }); var ax = new Bpl.ForallExpr(f.tok, new List(), bvars, null, tr, - Bpl.Expr.Imp(Bpl.Expr.And(wellFormed, Bpl.Expr.And(h0IsHeapAnchor, heapSucc)), - Bpl.Expr.Imp(q0, eq))); + BplImp(BplAnd(wellFormed, BplAnd(h0IsHeapAnchor, heapSucc)), + BplImp(q0, eq))); sink.AddTopLevelDeclaration(new Bpl.Axiom(f.tok, ax, comment)); } -} \ No newline at end of file +} diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Iterators.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Iterators.cs index 84cc98baca..54c50f04c6 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Iterators.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Iterators.cs @@ -69,7 +69,7 @@ Bpl.Procedure AddIteratorProc(IteratorDecl iter, MethodTranslationKind kind) { currentModule = iter.EnclosingModuleDefinition; codeContext = iter; - var etran = new ExpressionTranslator(this, predef, iter.tok); + var etran = new ExpressionTranslator(this, predef, iter.tok, iter); var inParams = new List(); List outParams; @@ -146,7 +146,7 @@ void AddIteratorWellformednessCheck(IteratorDecl iter, Procedure proc) { Contract.Assert(proc.OutParams.Count == 0); var builder = new BoogieStmtListBuilder(this, options); - var etran = new ExpressionTranslator(this, predef, iter.tok); + var etran = new ExpressionTranslator(this, predef, iter.tok, iter); // Don't do reads checks since iterator reads clauses mean something else. // See comment inside GenerateIteratorImplPrelude(). etran = etran.WithReadsFrame(null); @@ -156,7 +156,7 @@ void AddIteratorWellformednessCheck(IteratorDecl iter, Procedure proc) { // check well-formedness of any default-value expressions (before assuming preconditions) foreach (var formal in iter.Ins.Where(formal => formal.DefaultValue != null)) { var e = formal.DefaultValue; - CheckWellformed(e, new WFOptions(null, false, false, true), localVariables, builder, etran); + CheckWellformed(e, new WFOptions(null, false, false, true), localVariables, builder, etran.WithReadsFrame(etran.readsFrame, null)); builder.Add(new Bpl.AssumeCmd(e.tok, etran.CanCallAssumption(e))); CheckSubrange(e.tok, etran.TrExpr(e), e.Type, formal.Type, builder); } @@ -210,7 +210,7 @@ void AddIteratorWellformednessCheck(IteratorDecl iter, Procedure proc) { new List())); // assume the implicit postconditions promised by MoveNext: // assume fresh(_new - old(_new)); - var yeEtran = new ExpressionTranslator(this, predef, etran.HeapExpr, new Bpl.IdentifierExpr(iter.tok, "$_OldIterHeap", predef.HeapType)); + var yeEtran = new ExpressionTranslator(this, predef, etran.HeapExpr, new Bpl.IdentifierExpr(iter.tok, "$_OldIterHeap", predef.HeapType), iter); var old_nw = new OldExpr(iter.tok, nw); old_nw.Type = nw.Type; // resolve here var setDiff = new BinaryExpr(iter.tok, BinaryExpr.Opcode.Sub, nw, old_nw); @@ -279,7 +279,7 @@ void AddIteratorImpl(IteratorDecl iter, Bpl.Procedure proc) { Contract.Assert(proc.OutParams.Count == 0); var builder = new BoogieStmtListBuilder(this, options); - var etran = new ExpressionTranslator(this, predef, iter.tok); + var etran = new ExpressionTranslator(this, predef, iter.tok, iter); // Don't do reads checks since iterator reads clauses mean something else. // See comment inside GenerateIteratorImplPrelude(). etran = etran.WithReadsFrame(null); @@ -338,7 +338,7 @@ Bpl.Expr YieldCountAssumption(IteratorDecl iter, ExpressionTranslator etran) { Bpl.Expr wh = Bpl.Expr.True; foreach (var ys in iter.OutsHistoryFields) { // add the conjunct: _yieldCount == |this.ys| - wh = Bpl.Expr.And(wh, Bpl.Expr.Eq(new Bpl.IdentifierExpr(iter.tok, yieldCountVariable), + wh = BplAnd(wh, Bpl.Expr.Eq(new Bpl.IdentifierExpr(iter.tok, yieldCountVariable), FunctionCall(iter.tok, BuiltinFunction.SeqLength, null, ApplyUnbox(iter.tok, ReadHeap(iter.tok, etran.HeapExpr, new Bpl.IdentifierExpr(iter.tok, etran.This, predef.RefType), diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.LetExpr.cs b/Source/DafnyCore/Verifier/BoogieGenerator.LetExpr.cs index 7d5e846c11..9bcfa1a391 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.LetExpr.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.LetExpr.cs @@ -103,7 +103,7 @@ Expression LetDesugaring(LetExpr e) { // now that we've declared the functions and axioms, let's prepare the let-such-that desugaring { - var etran = new ExpressionTranslator(this, predef, e.tok); + var etran = new ExpressionTranslator(this, predef, e.tok, null); var rhss = new List(); foreach (var bv in e.BoundVars) { var args = info.SkolemFunctionArgs(bv, this, etran); @@ -135,7 +135,7 @@ private Bpl.Function AddLetSuchThatCanCallFunction(LetExpr e, LetSuchThatExprInf } private void AddLetSuchThenCanCallAxiom(LetExpr e, LetSuchThatExprInfo info, Bpl.Function canCallFunction) { - var etranCC = new ExpressionTranslator(this, predef, info.HeapExpr(this, false), info.HeapExpr(this, true)); + var etranCC = new ExpressionTranslator(this, predef, info.HeapExpr(this, false), info.HeapExpr(this, true), null); Bpl.Expr typeAntecedents; // later ignored List gg = info.GAsVars(this, false, out typeAntecedents, etranCC); var gExprs = new List(); @@ -176,7 +176,7 @@ private void AddLetSuchThenCanCallAxiom(LetExpr e, LetSuchThatExprInfo info, Bpl var canCall = FunctionCall(e.tok, info.CanCallFunctionName(), Bpl.Type.Bool, gExprs); var p = Substitute(e.RHSs[0], receiverReplacement, substMap); - Bpl.Expr ax = Bpl.Expr.Imp(canCall, BplAnd(antecedent, etranCC.TrExpr(p))); + Bpl.Expr ax = BplImp(canCall, BplAnd(antecedent, etranCC.TrExpr(p))); ax = BplForall(gg, tr, ax); AddOtherDefinition(canCallFunction, new Bpl.Axiom(e.tok, ax)); } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs index d5a46ab289..8f03c2cbc5 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Methods.cs @@ -223,7 +223,7 @@ private void AddAllocationAxiom(Boogie.Declaration fieldDeclaration, Field f, To var cf = (ConstantField)f; AddWellformednessCheck(cf); if (InVerificationScope(cf)) { - var etran = new ExpressionTranslator(this, predef, f.tok); + var etran = new ExpressionTranslator(this, predef, f.tok, null); heightAntecedent = Bpl.Expr.Lt(Bpl.Expr.Literal(cf.EnclosingModule.CallGraph.GetSCCRepresentativePredecessorCount(cf)), etran.FunctionContextHeight()); } } @@ -541,7 +541,8 @@ private void AddMethodImpl(Method m, Boogie.Procedure proc, bool wellformednessP var builder = new BoogieStmtListBuilder(this, options); var builderInitializationArea = new BoogieStmtListBuilder(this, options); builder.Add(new CommentCmd("AddMethodImpl: " + m + ", " + proc)); - var etran = new ExpressionTranslator(this, predef, m.tok); + var etran = new ExpressionTranslator(this, predef, m.tok, + m.IsByMethod ? m.FunctionFromWhichThisIsByMethodDecl : m); // Only do reads checks for methods, not lemmas // (which aren't allowed to declare frames and don't check reads and writes against them). // Also don't do any reads checks if the reads clause is *, @@ -681,7 +682,7 @@ private void AddMethodImpl(Method m, Boogie.Procedure proc, bool wellformednessP readsCheckDelayer.DoWithDelayedReadsChecks(true, wfo => { foreach (var formal in m.Ins.Where(formal => formal.DefaultValue != null)) { var e = formal.DefaultValue; - CheckWellformed(e, wfo, localVariables, builder, etran); + CheckWellformed(e, wfo, localVariables, builder, etran.WithReadsFrame(etran.readsFrame, null)); // No scope for default parameters builder.Add(new Boogie.AssumeCmd(e.tok, etran.CanCallAssumption(e))); CheckSubrange(e.tok, etran.TrExpr(e), e.Type, formal.Type, builder); @@ -808,7 +809,7 @@ private void AddMethodOverrideCheckImpl(Method m, Boogie.Procedure proc) { List outParams = Boogie.Formal.StripWhereClauses(proc.OutParams); var builder = new BoogieStmtListBuilder(this, options); - var etran = new ExpressionTranslator(this, predef, m.tok); + var etran = new ExpressionTranslator(this, predef, m.tok, m); var localVariables = new List(); InitializeFuelConstant(m.tok, builder, etran); @@ -906,7 +907,7 @@ private void AddFunctionOverrideCheckImpl(Function f) { Boogie.Expr prevHeap = null; Boogie.Expr currHeap = null; - var ordinaryEtran = new ExpressionTranslator(this, predef, f.tok); + var ordinaryEtran = new ExpressionTranslator(this, predef, f.tok, f); ExpressionTranslator etran; var inParams_Heap = new List(); if (f is TwoStateFunction) { @@ -918,7 +919,7 @@ private void AddFunctionOverrideCheckImpl(Function f) { inParams_Heap.Add(currHeapVar); currHeap = new Boogie.IdentifierExpr(f.tok, currHeapVar); } - etran = new ExpressionTranslator(this, predef, currHeap, prevHeap); + etran = new ExpressionTranslator(this, predef, currHeap, prevHeap, f); } else { etran = ordinaryEtran; } @@ -929,7 +930,7 @@ private void AddFunctionOverrideCheckImpl(Function f) { var outParams = new List(); if (!f.IsStatic) { var th = new Boogie.IdentifierExpr(f.tok, "this", TrReceiverType(f)); - Boogie.Expr wh = Boogie.Expr.And( + Boogie.Expr wh = BplAnd( ReceiverNotNull(th), etran.GoodRef(f.tok, th, ModuleResolver.GetReceiverType(f.tok, f))); Boogie.Formal thVar = new Boogie.Formal(f.tok, new Boogie.TypedIdent(f.tok, "this", TrReceiverType(f), wh), true); @@ -1155,10 +1156,10 @@ private void AddFunctionOverrideSubsetChk(Function func, BoogieStmtListBuilder b Bpl.IdentifierExpr o = new Bpl.IdentifierExpr(tok, oVar); Bpl.BoundVariable fVar = new Bpl.BoundVariable(tok, new Bpl.TypedIdent(tok, "$f", predef.FieldName(tok))); Bpl.IdentifierExpr f = new Bpl.IdentifierExpr(tok, fVar); - Bpl.Expr ante = Bpl.Expr.And(Bpl.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); + Bpl.Expr ante = BplAnd(Bpl.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); Bpl.Expr consequent = InRWClause(tok, o, f, traitFrameExps, etran, null, null); - Bpl.Expr lambda = new Bpl.LambdaExpr(tok, new List { }, new List { oVar, fVar }, null, - Bpl.Expr.Imp(ante, consequent)); + Bpl.Expr lambda = new Bpl.LambdaExpr(tok, new List(), new List { oVar, fVar }, null, + BplImp(ante, consequent)); //to initialize $_ReadsFrame variable to Frame' builder.Add(Bpl.Cmd.SimpleAssign(tok, new Bpl.IdentifierExpr(tok, frame), lambda)); @@ -1166,8 +1167,8 @@ private void AddFunctionOverrideSubsetChk(Function func, BoogieStmtListBuilder b // emit: assert (forall o: ref, f: Field :: o != null && $Heap[o,alloc] && (o,f) in subFrame ==> $_ReadsFrame[o,f]); Bpl.Expr oInCallee = InRWClause(tok, o, f, func.Reads.Expressions, etran, null, null); Bpl.Expr consequent2 = InRWClause(tok, o, f, traitFrameExps, etran, null, null); - Bpl.Expr q = new Bpl.ForallExpr(tok, new List { }, new List { oVar, fVar }, - Bpl.Expr.Imp(Bpl.Expr.And(ante, oInCallee), consequent2)); + Bpl.Expr q = new Bpl.ForallExpr(tok, new List(), new List { oVar, fVar }, + BplImp(BplAnd(ante, oInCallee), consequent2)); builder.Add(Assert(tok, q, new PODesc.TraitFrame(func.WhatKind, false), kv)); } @@ -1220,11 +1221,12 @@ private Boogie.Axiom FunctionOverrideAxiom(Function f, Function overridingFuncti bvPrevHeap = new Boogie.BoundVariable(f.tok, new Boogie.TypedIdent(f.tok, "$prevHeap", predef.HeapType)); etran = new ExpressionTranslator(this, predef, f.ReadsHeap ? new Boogie.IdentifierExpr(f.tok, predef.HeapVarName, predef.HeapType) : null, - new Boogie.IdentifierExpr(f.tok, bvPrevHeap)); + new Boogie.IdentifierExpr(f.tok, bvPrevHeap), + f); } else if (readsHeap) { - etran = new ExpressionTranslator(this, predef, f.tok); + etran = new ExpressionTranslator(this, predef, f.tok, f); } else { - etran = new ExpressionTranslator(this, predef, (Boogie.Expr)null); + etran = new ExpressionTranslator(this, predef, (Boogie.Expr)null, f); } // "forallFormals" is built to hold the bound variables of the quantification @@ -1295,7 +1297,7 @@ private Boogie.Axiom FunctionOverrideAxiom(Function f, Function overridingFuncti var isOfSubtype = GetWhereClause(overridingFunction.tok, bvThisExpr, thisType, f is TwoStateFunction ? etran.Old : etran, IsAllocType.NEVERALLOC, alwaysUseSymbolicName: true); - Bpl.Expr ante = Boogie.Expr.And(ReceiverNotNull(bvThisExpr), isOfSubtype); + Bpl.Expr ante = BplAnd(ReceiverNotNull(bvThisExpr), isOfSubtype); // Add other arguments var typeMap = GetTypeArgumentSubstitutionMap(f, overridingFunction); @@ -1328,7 +1330,7 @@ private Boogie.Axiom FunctionOverrideAxiom(Function f, Function overridingFuncti argsCF = Concat(argsCF, moreArgsCF); // ante := useViaCanCall || (useViaContext && this != null && $Is(this, C)) - ante = Bpl.Expr.Or(useViaCanCall, BplAnd(useViaContext, ante)); + ante = BplOr(useViaCanCall, BplAnd(useViaContext, ante)); Boogie.Expr funcAppl; { @@ -1361,10 +1363,10 @@ private Boogie.Axiom FunctionOverrideAxiom(Function f, Function overridingFuncti // The axiom Boogie.Expr ax = BplForall(f.tok, new List(), forallFormals, null, tr, - Boogie.Expr.Imp(ante, synonyms)); + BplImp(ante, synonyms)); var activate = AxiomActivation(overridingFunction, etran); string comment = "override axiom for " + f.FullSanitizedName + " in class " + overridingFunction.EnclosingClass.FullSanitizedName; - return new Boogie.Axiom(f.tok, Boogie.Expr.Imp(activate, ax), comment); + return new Boogie.Axiom(f.tok, BplImp(activate, ax), comment); } /// @@ -1559,13 +1561,13 @@ private void AddMethodOverrideFrameSubsetChk(Method m, bool isModifies, BoogieSt var o = new Boogie.IdentifierExpr(tok, oVar); var fVar = new Boogie.BoundVariable(tok, new Boogie.TypedIdent(tok, "$f", predef.FieldName(tok))); var f = new Boogie.IdentifierExpr(tok, fVar); - var ante = Boogie.Expr.And(Boogie.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); + var ante = BplAnd(Boogie.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); // emit: assert (forall o: ref, f: Field :: o != null && $Heap[o,alloc] && (o,f) in subFrame ==> $_Frame[o,f]); var oInCallee = InRWClause(tok, o, f, classFrameExps, etran, null, null); var consequent2 = InRWClause(tok, o, f, traitFrameExps, etran, null, null); var q = new Boogie.ForallExpr(tok, new List(), new List { oVar, fVar }, - Boogie.Expr.Imp(Boogie.Expr.And(ante, oInCallee), consequent2)); + BplImp(BplAnd(ante, oInCallee), consequent2)); builder.Add(Assert(m.RangeToken, q, new PODesc.TraitFrame(m.WhatKind, isModifies), kv)); } @@ -1629,7 +1631,7 @@ private Boogie.Procedure AddMethod(Method m, MethodTranslationKind kind) { isAllocContext = new IsAllocContext(options, m.IsGhost); Boogie.Expr prevHeap = null; Boogie.Expr currHeap = null; - var ordinaryEtran = new ExpressionTranslator(this, predef, m.tok); + var ordinaryEtran = new ExpressionTranslator(this, predef, m.tok, m); ExpressionTranslator etran; var inParams = new List(); if (m is TwoStateLemma) { @@ -1639,7 +1641,7 @@ private Boogie.Procedure AddMethod(Method m, MethodTranslationKind kind) { inParams.Add(currHeapVar); prevHeap = new Boogie.IdentifierExpr(m.tok, prevHeapVar); currHeap = new Boogie.IdentifierExpr(m.tok, currHeapVar); - etran = new ExpressionTranslator(this, predef, currHeap, prevHeap); + etran = new ExpressionTranslator(this, predef, currHeap, prevHeap, m); } else { etran = ordinaryEtran; } @@ -1714,7 +1716,7 @@ private Boogie.Procedure AddMethod(Method m, MethodTranslationKind kind) { var post = s.E; if (kind == MethodTranslationKind.Implementation && RefinementToken.IsInherited(s.Tok, currentModule)) { // this postcondition was inherited into this module, so make it into the form "$_reverifyPost ==> s.E" - post = Boogie.Expr.Imp(new Boogie.IdentifierExpr(s.E.tok, "$_reverifyPost", Boogie.Type.Bool), post); + post = BplImp(new Boogie.IdentifierExpr(s.E.tok, "$_reverifyPost", Boogie.Type.Bool), post); } if (s.IsOnlyFree && bodyKind) { // don't include in split -- it would be ignored, anyhow diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.SplitExpr.cs b/Source/DafnyCore/Verifier/BoogieGenerator.SplitExpr.cs index 8a30ecaf11..3f97f1850e 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.SplitExpr.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.SplitExpr.cs @@ -196,7 +196,7 @@ bool TrSplitExpr(Expression expr, List/*!*/ splits, bool pos Bpl.Expr eqComponents = Bpl.Expr.True; foreach (var c in CoPrefixEquality(tok, codecl, e1type.TypeArgs, e2type.TypeArgs, kMinusOne, layer, A2, B2, true)) { eqComponents = BplAnd(eqComponents, c); - var p = Bpl.Expr.Binary(c.tok, BinaryOperator.Opcode.Or, prefixEqK, Bpl.Expr.Imp(kHasSuccessor, c)); + var p = Bpl.Expr.Binary(c.tok, BinaryOperator.Opcode.Or, prefixEqK, BplImp(kHasSuccessor, c)); splits.Add(ToSplitExprInfo(SplitExprInfo.K.Checked, p)); } if (e.E0.Type.IsBigOrdinalType) { @@ -204,7 +204,7 @@ bool TrSplitExpr(Expression expr, List/*!*/ splits, bool pos Bpl.Expr.Neq(k, FunctionCall(k.tok, "ORD#FromNat", predef.BigOrdinalType, Bpl.Expr.Literal(0))), FunctionCall(k.tok, "ORD#IsLimit", Bpl.Type.Bool, k)); var eq = CoEqualCall(codecl, e1type.TypeArgs, e2type.TypeArgs, null, etran.layerInterCluster.LayerN((int)FuelSetting.FuelAmount.HIGH), A, B); - var p = Bpl.Expr.Binary(tok, BinaryOperator.Opcode.Or, prefixEqK, BplOr(BplImp(kHasSuccessor, eqComponents), Bpl.Expr.Imp(kIsNonZeroLimit, eq))); + var p = Bpl.Expr.Binary(tok, BinaryOperator.Opcode.Or, prefixEqK, BplOr(BplImp(kHasSuccessor, eqComponents), BplImp(kIsNonZeroLimit, eq))); splits.Add(ToSplitExprInfo(SplitExprInfo.K.Checked, p)); } splits.Add(ToSplitExprInfo(SplitExprInfo.K.Free, prefixEqK)); @@ -319,12 +319,12 @@ bool TrSplitExpr(Expression expr, List/*!*/ splits, bool pos if (!position) { ihBody = Bpl.Expr.Not(ihBody); } - ihBody = Bpl.Expr.Imp(less, ihBody); + ihBody = BplImp(less, ihBody); List bvars = new List(); Bpl.Expr typeAntecedent = etran.TrBoundVariables(kvars, bvars); // no need to use allocation antecedent here, because the well-founded less-than ordering assures kk are allocated Bpl.Expr ih; var tr = TrTrigger(etran, e.Attributes, expr.tok, substMap); - ih = new Bpl.ForallExpr(expr.tok, bvars, tr, Bpl.Expr.Imp(typeAntecedent, ihBody)); + ih = new Bpl.ForallExpr(expr.tok, bvars, tr, BplImp(typeAntecedent, ihBody)); // More precisely now: // (forall n :: n-has-expected-type && (forall k :: k < n ==> P(k)) && case0(n) ==> P(n)) @@ -359,9 +359,9 @@ bool TrSplitExpr(Expression expr, List/*!*/ splits, bool pos Bpl.Expr q; var trig = TrTrigger(etranBody, e.Attributes, expr.tok); if (position) { - q = new Bpl.ForallExpr(kase.tok, bvars, trig, Bpl.Expr.Imp(ante, bdy)); + q = new Bpl.ForallExpr(kase.tok, bvars, trig, BplImp(ante, bdy)); } else { - q = new Bpl.ExistsExpr(kase.tok, bvars, trig, Bpl.Expr.And(ante, bdy)); + q = new Bpl.ExistsExpr(kase.tok, bvars, trig, BplAnd(ante, bdy)); } splits.Add(ToSplitExprInfo(SplitExprInfo.K.Checked, q)); } @@ -519,7 +519,7 @@ private bool TrSplitFunctionCallExpr(Expression expr, List splits var p = Bpl.Expr.Binary(fargs.tok, BinaryOperator.Opcode.Imp, canCall, fargs); splits.Add(ToSplitExprInfo(SplitExprInfo.K.Checked, p)); // F#canCall(args) && F(args) - var fr = Bpl.Expr.And(canCall, fargs); + var fr = BplAnd(canCall, fargs); splits.Add(ToSplitExprInfo(SplitExprInfo.K.Free, fr)); } else { // inline this body @@ -533,7 +533,7 @@ private bool TrSplitFunctionCallExpr(Expression expr, List splits foreach (var s in ss) { if (s.IsChecked) { var unboxedConjunct = CondApplyUnbox(s.E.tok, s.E, typeSpecializedResultType, expr.Type); - var bodyOrConjunct = Bpl.Expr.Or(fargs, unboxedConjunct); + var bodyOrConjunct = BplOr(fargs, unboxedConjunct); var tok = needsTokenAdjust ? (IToken)new ForceCheckToken(typeSpecializedBody.tok) : (IToken)new NestedToken(GetToken(fexp), s.Tok); @@ -551,7 +551,7 @@ private bool TrSplitFunctionCallExpr(Expression expr, List splits Expr tr_ee = etran.TrExpr(ee); Bpl.Expr wh = GetWhereClause(e.tok, tr_ee, cce.NonNull(ee.Type), etran, NOALLOC); if (wh != null) { - fargs = Bpl.Expr.And(fargs, wh); + fargs = BplAnd(fargs, wh); } } } @@ -560,7 +560,7 @@ private bool TrSplitFunctionCallExpr(Expression expr, List splits var trBody = etran.TrExpr(typeSpecializedBody); trBody = CondApplyUnbox(trBody.tok, trBody, typeSpecializedResultType, expr.Type); // F#canCall(args) && F(args) && (b0 && b1 && b2) - var fr = Bpl.Expr.And(canCall, BplAnd(fargs, trBody)); + var fr = BplAnd(canCall, BplAnd(fargs, trBody)); splits.Add(ToSplitExprInfo(SplitExprInfo.K.Free, fr)); } diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.TrStatement.cs b/Source/DafnyCore/Verifier/BoogieGenerator.TrStatement.cs index b7cf77f1ac..c27b90f21b 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.TrStatement.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.TrStatement.cs @@ -102,7 +102,7 @@ private void TrStmt(Statement stmt, BoogieStmtListBuilder builder, List { etran.HeapCastToIdentifierExpr })); updater.Add(TrAssumeCmd(s.Tok, HeapSucc(prevHeap, etran.HeapExpr))); @@ -1308,7 +1308,7 @@ void TrForallAssign(ForallStmt s, AssignStmt s0, xBody = BplAnd(xBody, Bpl.Expr.Eq(f, xField)); //TRIG (exists k#2: int :: (k#2 == LitInt(0 - 3) || k#2 == LitInt(4)) && $o == read($prevHeap, this, _module.MyClass.arr) && $f == MultiIndexField(IndexField(i#0), j#0)) Bpl.Expr xObjField = new Bpl.ExistsExpr(s.Tok, xBvars, xBody); // LL_TRIGGER - Bpl.Expr body = Bpl.Expr.Or(Bpl.Expr.Eq(heapOF, oldHeapOF), xObjField); + Bpl.Expr body = BplOr(Bpl.Expr.Eq(heapOF, oldHeapOF), xObjField); var tr = new Trigger(s.Tok, true, new List() { heapOF }); Bpl.Expr qq = new Bpl.ForallExpr(s.Tok, new List { }, new List { oVar, fVar }, null, tr, body); updater.Add(TrAssumeCmd(s.Tok, qq)); @@ -1371,7 +1371,7 @@ private Bpl.Expr TrForall_NewValueAssumption(IToken tok, List boundVar tr = new Bpl.Trigger(tok, true, tt, tr); } } - return new Bpl.ForallExpr(tok, xBvars, tr, Bpl.Expr.Imp(xAnte, Bpl.Expr.Eq(xHeapOF, g))); + return new Bpl.ForallExpr(tok, xBvars, tr, BplImp(xAnte, Bpl.Expr.Eq(xHeapOF, g))); } void TrLoop(LoopStmt s, Expression Guard, BodyTranslator/*?*/ bodyTr, @@ -1389,7 +1389,7 @@ void TrLoop(LoopStmt s, Expression Guard, BodyTranslator/*?*/ bodyTr, Bpl.LocalVariable preLoopHeapVar = new Bpl.LocalVariable(s.Tok, new Bpl.TypedIdent(s.Tok, "$PreLoopHeap$" + suffix, predef.HeapType)); locals.Add(preLoopHeapVar); Bpl.IdentifierExpr preLoopHeap = new Bpl.IdentifierExpr(s.Tok, preLoopHeapVar); - ExpressionTranslator etranPreLoop = new ExpressionTranslator(this, predef, preLoopHeap); + ExpressionTranslator etranPreLoop = new ExpressionTranslator(this, predef, preLoopHeap, etran.scope); ExpressionTranslator updatedFrameEtran; string loopFrameName = "$Frame$" + suffix; if (s.Mod.Expressions != null) { @@ -1400,7 +1400,7 @@ void TrLoop(LoopStmt s, Expression Guard, BodyTranslator/*?*/ bodyTr, if (s.Mod.Expressions != null) { // check well-formedness and that the modifies is a subset CheckFrameWellFormed(new WFOptions(), s.Mod.Expressions, locals, builder, etran); - CheckFrameSubset(s.Tok, s.Mod.Expressions, null, null, etran, etran.ModifiesFrame(s.Tok), builder, new PODesc.FrameSubset("loop modifies clause", true), null); + CheckFrameSubset(s.Tok, s.Mod.Expressions, null, null, etran, etran.ModifiesFrame(s.Tok), builder, new PODesc.ModifyFrameSubset("loop modifies clause"), null); DefineFrame(s.Tok, etran.ModifiesFrame(s.Tok), s.Mod.Expressions, builder, locals, loopFrameName); } builder.Add(Bpl.Cmd.SimpleAssign(s.Tok, preLoopHeap, etran.HeapExpr)); @@ -1437,10 +1437,10 @@ void TrLoop(LoopStmt s, Expression Guard, BodyTranslator/*?*/ bodyTr, TrStmt_CheckWellformed(loopInv.E, invDefinednessBuilder, locals, etran, false); invDefinednessBuilder.Add(TrAssumeCmdWithDependencies(etran, loopInv.E.tok, loopInv.E, "loop invariant")); - invariants.Add(TrAssumeCmd(loopInv.E.tok, Bpl.Expr.Imp(w, etran.CanCallAssumption(loopInv.E)))); + invariants.Add(TrAssumeCmd(loopInv.E.tok, BplImp(w, etran.CanCallAssumption(loopInv.E)))); var ss = TrSplitExpr(loopInv.E, etran, false, out var splitHappened); if (!splitHappened) { - var wInv = Bpl.Expr.Imp(w, etran.TrExpr(loopInv.E)); + var wInv = BplImp(w, etran.TrExpr(loopInv.E)); invariants.Add(Assert(loopInv.E.tok, wInv, new PODesc.LoopInvariant(errorMessage, successMessage))); } else { foreach (var split in ss) { @@ -1491,7 +1491,7 @@ void TrLoop(LoopStmt s, Expression Guard, BodyTranslator/*?*/ bodyTr, // include a free invariant that says that all definite-assignment trackers have only become more "true" foreach (var pair in daTrackersMonotonicity) { - Bpl.Expr monotonic = Bpl.Expr.Imp(pair.Item1, pair.Item2); + Bpl.Expr monotonic = BplImp(pair.Item1, pair.Item2); invariants.Add(TrAssumeCmd(s.Tok, monotonic)); } @@ -1918,14 +1918,14 @@ void ProcessCallStmt(CallStmt cs, Dictionary tySubst, Bpl.E if (etran.readsFrame != null) { var readsSubst = new Substituter(null, new Dictionary(), tySubst); CheckFrameSubset(tok, callee.Reads.Expressions.ConvertAll(readsSubst.SubstFrameExpr), - receiver, substMap, etran, etran.ReadsFrame(tok), builder, new PODesc.FrameSubset("call", false), null); + receiver, substMap, etran, etran.ReadsFrame(tok), builder, new PODesc.ReadFrameSubset("call"), null); } // Check that the modifies clause of a subcall is a subset of the current modifies frame, // but only if we're in a context that defines a modifies frame. if (codeContext is IMethodCodeContext) { var modifiesSubst = new Substituter(null, new Dictionary(), tySubst); CheckFrameSubset(tok, callee.Mod.Expressions.ConvertAll(modifiesSubst.SubstFrameExpr), - receiver, substMap, etran, etran.ModifiesFrame(tok), builder, new PODesc.FrameSubset("call", true), null); + receiver, substMap, etran, etran.ModifiesFrame(tok), builder, new PODesc.ModifyFrameSubset("call"), null); } // Check termination @@ -2068,7 +2068,7 @@ void TrForallStmtCall(IToken tok, List boundVars, List bo var initHeapVar = new Bpl.LocalVariable(tok, new Bpl.TypedIdent(tok, CurrentIdGenerator.FreshId("$initHeapForallStmt#"), predef.HeapType)); locals.Add(initHeapVar); var initHeap = new Bpl.IdentifierExpr(tok, initHeapVar); - var initEtran = new ExpressionTranslator(this, predef, initHeap, etran.Old.HeapExpr); + var initEtran = new ExpressionTranslator(this, predef, initHeap, etran.Old.HeapExpr, etran.scope); // initHeap := $Heap; exporter.Add(Bpl.Cmd.SimpleAssign(tok, initHeap, etran.HeapExpr)); var heapIdExpr = etran.HeapCastToIdentifierExpr; @@ -2095,7 +2095,7 @@ void TrForallStmtCall(IToken tok, List boundVars, List bo Bpl.Expr ante; var argsSubstMap = new Dictionary(); // maps formal arguments to actuals Contract.Assert(s0.Method.Ins.Count == s0.Args.Count); - var callEtran = new ExpressionTranslator(this, predef, etran.HeapExpr, initHeap); + var callEtran = new ExpressionTranslator(this, predef, etran.HeapExpr, initHeap, etran.scope); Bpl.Expr post = Bpl.Expr.True; Bpl.Trigger tr; if (forallExpressions != null) { @@ -2133,7 +2133,7 @@ void TrForallStmtCall(IToken tok, List boundVars, List bo // TRIG (forall $ih#s0#0: Seq :: $Is($ih#s0#0, TSeq(TChar)) && $IsAlloc($ih#s0#0, TSeq(TChar), $initHeapForallStmt#0) && Seq#Length($ih#s0#0) != 0 && Seq#Rank($ih#s0#0) < Seq#Rank(s#0) ==> (forall i#2: int :: true ==> LitInt(0) <= i#2 && i#2 < Seq#Length($ih#s0#0) ==> char#ToInt(_module.CharChar.MinChar($LS($LZ), $Heap, this, $ih#s0#0)) <= char#ToInt($Unbox(Seq#Index($ih#s0#0, i#2)): char))) // TRIG (forall $ih#pat0#0: Seq, $ih#a0#0: Seq :: $Is($ih#pat0#0, TSeq(_module._default.Same0$T)) && $IsAlloc($ih#pat0#0, TSeq(_module._default.Same0$T), $initHeapForallStmt#0) && $Is($ih#a0#0, TSeq(_module._default.Same0$T)) && $IsAlloc($ih#a0#0, TSeq(_module._default.Same0$T), $initHeapForallStmt#0) && Seq#Length($ih#pat0#0) <= Seq#Length($ih#a0#0) && Seq#SameUntil($ih#pat0#0, $ih#a0#0, Seq#Length($ih#pat0#0)) && (Seq#Rank($ih#pat0#0) < Seq#Rank(pat#0) || (Seq#Rank($ih#pat0#0) == Seq#Rank(pat#0) && Seq#Rank($ih#a0#0) < Seq#Rank(a#0))) ==> _module.__default.IsRelaxedPrefixAux(_module._default.Same0$T, $LS($LZ), $Heap, $ih#pat0#0, $ih#a0#0, LitInt(1)))' // TRIG (forall $ih#m0#0: DatatypeType, $ih#n0#0: DatatypeType :: $Is($ih#m0#0, Tclass._module.Nat()) && $IsAlloc($ih#m0#0, Tclass._module.Nat(), $initHeapForallStmt#0) && $Is($ih#n0#0, Tclass._module.Nat()) && $IsAlloc($ih#n0#0, Tclass._module.Nat(), $initHeapForallStmt#0) && Lit(true) && (DtRank($ih#m0#0) < DtRank(m#0) || (DtRank($ih#m0#0) == DtRank(m#0) && DtRank($ih#n0#0) < DtRank(n#0))) ==> _module.__default.mult($LS($LZ), $Heap, $ih#m0#0, _module.__default.plus($LS($LZ), $Heap, $ih#n0#0, $ih#n0#0)) == _module.__default.mult($LS($LZ), $Heap, _module.__default.plus($LS($LZ), $Heap, $ih#m0#0, $ih#m0#0), $ih#n0#0)) - var qq = new Bpl.ForallExpr(tok, bvars, tr, Bpl.Expr.Imp(ante, post)); // TODO: Add a SMART_TRIGGER here. If we can't find one, abort the attempt to do induction automatically + var qq = new Bpl.ForallExpr(tok, bvars, tr, BplImp(ante, post)); // TODO: Add a SMART_TRIGGER here. If we can't find one, abort the attempt to do induction automatically exporter.Add(TrAssumeCmd(tok, qq)); } } @@ -2333,7 +2333,7 @@ void AssertDistinctness(Expression lhsa, Expression lhsb, BoogieStmtListBuilder void AssertDistinctness(Expression lhsa, Expression lhsb, Bpl.Expr rhsa, Bpl.Expr rhsb, BoogieStmtListBuilder builder, ExpressionTranslator etran) { Bpl.Expr e = CheckDistinctness(lhsa, lhsb, etran); if (e != null) { - e = Bpl.Expr.Or(e, Bpl.Expr.Eq(rhsa, rhsb)); + e = BplOr(e, Bpl.Expr.Eq(rhsa, rhsb)); builder.Add(Assert(GetToken(lhsa), e, new PODesc.DistinctLHS(Printer.ExprToString(options, lhsa), Printer.ExprToString(options, lhsb), false, true))); } @@ -2721,7 +2721,7 @@ private void SelectAllocateObject(IToken tok, Bpl.IdentifierExpr nw, Type type, var nwNotNull = Bpl.Expr.Neq(nw, predef.Null); // drop the $Is conjunct if the type is "object", because "new object" allocates an object of an arbitrary type var rightType = type.IsObjectQ ? Bpl.Expr.True : MkIs(nw, type); - builder.Add(TrAssumeCmd(tok, Bpl.Expr.And(nwNotNull, rightType))); + builder.Add(TrAssumeCmd(tok, BplAnd(nwNotNull, rightType))); } // assume !$Heap[$nw, alloc]; var notAlloc = Bpl.Expr.Not(etran.IsAlloced(tok, nw)); diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.Types.cs b/Source/DafnyCore/Verifier/BoogieGenerator.Types.cs index 210f45c8c3..b144cbeb2f 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.Types.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.Types.cs @@ -111,10 +111,10 @@ private void AddArrowTypeAxioms(ArrowTypeDecl ad) { var bx = BplBoundVar("bx", predef.BoxType, bvars); lhs = Bpl.Expr.SelectTok(tok, lhs, bx); rhs = Bpl.Expr.SelectTok(tok, rhs, bx); - // op = Bpl.Expr.Imp; + // op = BplImp; } if (selectorVar == "r") { - op = (u, v) => Bpl.Expr.Imp(v, u); + op = (u, v) => BplImp(v, u); } AddOtherDefinition(GetOrCreateTypeConstructor(ad), new Axiom(tok, BplForall(bvars, BplTrigger(lhs), op(lhs, rhs)))); @@ -998,7 +998,7 @@ void AddRedirectingTypeDeclAxioms(bool is_alloc, T dd, string fullName) comment = $"$Is axiom for {dd.WhatKind} {fullName}"; // $Is(o, ..) is_o = MkIs(o, o_ty, ModeledAsBoxType(baseType)); - var etran = new ExpressionTranslator(this, predef, NewOneHeapExpr(dd.tok)); + var etran = new ExpressionTranslator(this, predef, NewOneHeapExpr(dd.tok), null); Bpl.Expr parentConstraint, constraint; if (baseType.IsNumericBased() || baseType.IsBitVectorType || baseType.IsBoolType || baseType.IsCharType) { // optimize this to only use the numeric/bitvector constraint, not the whole $Is thing on the base type @@ -1248,13 +1248,13 @@ void PutSourceIntoLocal() { // Check "expr < (1 << toWdith)" in type "int" PutSourceIntoLocal(); var bound = Bpl.Expr.Literal(toBound); - boundsCheck = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(0), o), Bpl.Expr.Lt(o, bound)); + boundsCheck = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(0), o), Bpl.Expr.Lt(o, bound)); } else if (fromType.IsNumericBased(Type.NumericPersuasion.Real)) { // Check "Int(expr) < (1 << toWdith)" in type "int" PutSourceIntoLocal(); var bound = Bpl.Expr.Literal(toBound); var oi = FunctionCall(tok, BuiltinFunction.RealToInt, null, o); - boundsCheck = Bpl.Expr.And(Bpl.Expr.Le(Bpl.Expr.Literal(0), oi), Bpl.Expr.Lt(oi, bound)); + boundsCheck = BplAnd(Bpl.Expr.Le(Bpl.Expr.Literal(0), oi), Bpl.Expr.Lt(oi, bound)); } else if (fromType.IsBigOrdinalType) { var bound = Bpl.Expr.Literal(toBound); var oi = FunctionCall(tok, "ORD#Offset", Bpl.Type.Int, o); @@ -1397,7 +1397,7 @@ void AddWellformednessCheck(RedirectingTypeDecl decl) { currentModule = decl.Module; codeContext = new CallableWrapper(decl, true); - var etran = new ExpressionTranslator(this, predef, decl.tok); + var etran = new ExpressionTranslator(this, predef, decl.tok, null); // parameters of the procedure var inParams = MkTyParamFormals(decl.TypeArgs, true); diff --git a/Source/DafnyCore/Verifier/BoogieGenerator.cs b/Source/DafnyCore/Verifier/BoogieGenerator.cs index 52788f3f80..115116be89 100644 --- a/Source/DafnyCore/Verifier/BoogieGenerator.cs +++ b/Source/DafnyCore/Verifier/BoogieGenerator.cs @@ -1167,7 +1167,7 @@ public Expr TypeSpecificEqual(IToken tok, Dafny.Type type, Expr e0, Expr e1) { Contract.Requires(B != null); Contract.Requires(l != null); Contract.Requires(predef != null); - var etran = new ExpressionTranslator(this, predef, dt.tok); + var etran = new ExpressionTranslator(this, predef, dt.tok, dt); // For example, for possibly infinite lists: // codatatype SList = Nil | SCons(head: T, tail: SList); // produce with conjucts=false (default): @@ -1509,7 +1509,7 @@ public Specialization(IVariable formal, MatchCase mc, Specialization prev, Boogi // IsGoodHeap(h) && OlderTag(h) && F(x, y) && IsAlloc(y, Y, h) // ==> IsAlloc(x, X, h)) var heapVar = BplBoundVar("$olderHeap", predef.HeapType, out var heap); - var etran = new ExpressionTranslator(this, predef, heap); + var etran = new ExpressionTranslator(this, predef, heap, f); var isGoodHeap = FunctionCall(f.tok, BuiltinFunction.IsGoodHeap, null, heap); var olderTag = FunctionCall(f.tok, "$OlderTag", Bpl.Type.Bool, heap); @@ -2050,7 +2050,7 @@ void DefineFrame(IToken/*!*/ tok, Boogie.IdentifierExpr frameIdentifier, List { }, new List { oVar, fVar }, null, - Bpl.Expr.Imp(ante, consequent)); + Bpl.Expr lambda = new Bpl.LambdaExpr(tok, new List(), new List { oVar, fVar }, null, + BplImp(ante, consequent)); builder.Add(Bpl.Cmd.SimpleAssign(tok, new Bpl.IdentifierExpr(tok, frame), lambda)); } @@ -2102,8 +2102,8 @@ void CheckFrameSubset(IToken tok, List calleeFrame, var oInCallee = InRWClause(tok, o, f, calleeFrame, etran, receiverReplacement, substMap); var inEnclosingFrame = Bpl.Expr.Select(enclosingFrame, o, f); - var q = new Bpl.ForallExpr(tok, new List { }, new List { oVar, fVar }, - Bpl.Expr.Imp(Bpl.Expr.And(ante, oInCallee), inEnclosingFrame)); + var q = new Bpl.ForallExpr(tok, new List(), new List { oVar, fVar }, + BplImp(BplAnd(ante, oInCallee), inEnclosingFrame)); if (IsExprAlways(q, true)) { return; } @@ -2125,12 +2125,12 @@ void CheckFrameEmpty(IToken tok, var o = new Bpl.IdentifierExpr(tok, oVar); var fVar = new Bpl.BoundVariable(tok, new Bpl.TypedIdent(tok, "$f", predef.FieldName(tok))); var f = new Bpl.IdentifierExpr(tok, fVar); - var ante = Bpl.Expr.And(Bpl.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); + var ante = BplAnd(Bpl.Expr.Neq(o, predef.Null), etran.IsAlloced(tok, o)); var inFrame = Bpl.Expr.Select(frame, o, f); var notInFrame = Bpl.Expr.Not(inFrame); - var q = new Bpl.ForallExpr(tok, new List { }, new List { oVar, fVar }, - Bpl.Expr.Imp(ante, notInFrame)); + var q = new Bpl.ForallExpr(tok, new List(), new List { oVar, fVar }, + BplImp(ante, notInFrame)); if (IsExprAlways(q, true)) { return; } @@ -2264,7 +2264,7 @@ Bpl.Expr InRWClause_Aux(IToken tok, Bpl.Expr o, Bpl.Expr boxO, Bpl.Expr f, List< Bpl.Expr XsubI = FunctionCall(tok, BuiltinFunction.SeqIndex, predef.BoxType, etran.TrExpr(e), i); // TODO: the equality in the next line should be changed to one that understands extensionality //TRIG (exists $i: int :: 0 <= $i && $i < Seq#Length(read($h0, this, _module.DoublyLinkedList.Nodes)) && Seq#Index(read($h0, this, _module.DoublyLinkedList.Nodes), $i) == $Box($o)) - disjunct = new Bpl.ExistsExpr(tok, new List { iVar }, Bpl.Expr.And(iBounds, Bpl.Expr.Eq(XsubI, boxO))); // LL_TRIGGER + disjunct = new Bpl.ExistsExpr(tok, new List { iVar }, BplAnd(iBounds, Bpl.Expr.Eq(XsubI, boxO))); // LL_TRIGGER } else { // o == e disjunct = Bpl.Expr.Eq(o, etran.TrExpr(e)); @@ -2272,10 +2272,10 @@ Bpl.Expr InRWClause_Aux(IToken tok, Bpl.Expr o, Bpl.Expr boxO, Bpl.Expr f, List< if (rwComponent.Field != null && f != null) { Bpl.Expr q = Bpl.Expr.Eq(f, new Bpl.IdentifierExpr(rwComponent.E.tok, GetField(rwComponent.Field))); if (usedInUnchanged) { - q = Bpl.Expr.Or(q, + q = BplOr(q, Bpl.Expr.Eq(f, new Bpl.IdentifierExpr(rwComponent.E.tok, predef.AllocField))); } - disjunct = Bpl.Expr.And(disjunct, q); + disjunct = BplAnd(disjunct, q); } disjunction = BplOr(disjunction, disjunct); } @@ -2303,7 +2303,7 @@ void AddWellformednessCheck(DatatypeCtor ctor) { currentModule = ctor.EnclosingDatatype.EnclosingModuleDefinition; codeContext = ctor.EnclosingDatatype; fuelContext = FuelSetting.NewFuelContext(ctor.EnclosingDatatype); - var etran = new ExpressionTranslator(this, predef, ctor.tok); + var etran = new ExpressionTranslator(this, predef, ctor.tok, null); // parameters of the procedure List inParams = MkTyParamFormals(GetTypeParams(ctor.EnclosingDatatype), true); @@ -2923,11 +2923,11 @@ private void GenerateMethodParametersChoose(IToken tok, IMethodCodeContext m, Me Bpl.Expr wh; var receiver = new Bpl.IdentifierExpr(tok, "this", TrType(receiverType)); if (m is Constructor && kind == MethodTranslationKind.Implementation) { - wh = Bpl.Expr.And( + wh = BplAnd( ReceiverNotNull(receiver), GetWhereClause(tok, receiver, receiverType, etran, IsAllocType.NEVERALLOC)); } else { - wh = Bpl.Expr.And( + wh = BplAnd( ReceiverNotNull(receiver), (m is TwoStateLemma ? etran.Old : etran).GoodRef(tok, receiver, receiverType)); } @@ -3128,14 +3128,14 @@ public BoilerplateTriple(IToken tok, bool isFree, Bpl.Expr expr, string errorMes Bpl.Expr ante = Bpl.Expr.Neq(o, predef.Null); if (canAllocate && use == FrameExpressionUse.Modifies) { - ante = Bpl.Expr.And(ante, etranMod.IsAlloced(tok, o)); + ante = BplAnd(ante, etranMod.IsAlloced(tok, o)); } var eq = Bpl.Expr.Eq(heapOF, preHeapOF); var ofInFrame = InRWClause(tok, o, f, frame, use == FrameExpressionUse.Unchanged, etranMod, null, null); - Bpl.Expr consequent = use == FrameExpressionUse.Modifies ? Bpl.Expr.Or(eq, ofInFrame) : Bpl.Expr.Imp(ofInFrame, eq); + Bpl.Expr consequent = use == FrameExpressionUse.Modifies ? BplOr(eq, ofInFrame) : BplImp(ofInFrame, eq); var tr = new Bpl.Trigger(tok, true, new List { heapOF }); - return new Bpl.ForallExpr(tok, typeVars, quantifiedVars, null, tr, Bpl.Expr.Imp(ante, consequent)); + return new Bpl.ForallExpr(tok, typeVars, quantifiedVars, null, tr, BplImp(ante, consequent)); } Bpl.Expr/*!*/ FrameConditionUsingDefinedFrame(IToken/*!*/ tok, ExpressionTranslator/*!*/ etranPre, ExpressionTranslator/*!*/ etran, ExpressionTranslator/*!*/ etranMod, Boogie.IdentifierExpr frameExpr) { @@ -3157,13 +3157,13 @@ public BoilerplateTriple(IToken tok, bool isFree, Bpl.Expr expr, string errorMes Bpl.Expr heapOF = ReadHeap(tok, etran.HeapExpr, o, f); Bpl.Expr preHeapOF = ReadHeap(tok, etranPre.HeapExpr, o, f); - Bpl.Expr ante = Bpl.Expr.And(Bpl.Expr.Neq(o, predef.Null), etranPre.IsAlloced(tok, o)); + Bpl.Expr ante = BplAnd(Bpl.Expr.Neq(o, predef.Null), etranPre.IsAlloced(tok, o)); Bpl.Expr consequent = Bpl.Expr.Eq(heapOF, preHeapOF); - consequent = Bpl.Expr.Or(consequent, Bpl.Expr.SelectTok(tok, frameExpr, o, f)); + consequent = BplOr(consequent, Bpl.Expr.SelectTok(tok, frameExpr, o, f)); Bpl.Trigger tr = new Bpl.Trigger(tok, true, new List { heapOF }); - return new Bpl.ForallExpr(tok, new List { }, new List { oVar, fVar }, null, tr, Bpl.Expr.Imp(ante, consequent)); + return new Bpl.ForallExpr(tok, new List(), new List { oVar, fVar }, null, tr, BplImp(ante, consequent)); } // ----- Type --------------------------------------------------------------------------------- // Translates a type into the representation Boogie type, @@ -3910,16 +3910,16 @@ Bpl.Expr CheckDistinctness(Expression lhsa, Expression lhsb, ExpressionTranslato if (lhsa is SeqSelectExpr iea && lhsb is SeqSelectExpr ieb) { Bpl.Expr ex = Bpl.Expr.Neq(etran.TrExpr(iea.Seq), etran.TrExpr(ieb.Seq)); if (iea.E1 == null && ieb.E1 == null) { - ex = Bpl.Expr.Or(ex, Bpl.Expr.Neq(etran.TrExpr(iea.E0), etran.TrExpr(ieb.E0))); + ex = BplOr(ex, Bpl.Expr.Neq(etran.TrExpr(iea.E0), etran.TrExpr(ieb.E0))); } else if (iea.E1 == null && ieb.E1 != null) { - ex = Bpl.Expr.Or(ex, Bpl.Expr.Le(etran.TrExpr(ieb.E1), etran.TrExpr(iea.E0))); - ex = Bpl.Expr.Or(ex, Bpl.Expr.Lt(etran.TrExpr(iea.E0), etran.TrExpr(ieb.E0))); + ex = BplOr(ex, Bpl.Expr.Le(etran.TrExpr(ieb.E1), etran.TrExpr(iea.E0))); + ex = BplOr(ex, Bpl.Expr.Lt(etran.TrExpr(iea.E0), etran.TrExpr(ieb.E0))); } else if (iea.E1 != null && ieb.E1 == null) { - ex = Bpl.Expr.Or(ex, Bpl.Expr.Le(etran.TrExpr(iea.E1), etran.TrExpr(ieb.E0))); - ex = Bpl.Expr.Or(ex, Bpl.Expr.Lt(etran.TrExpr(ieb.E0), etran.TrExpr(iea.E0))); + ex = BplOr(ex, Bpl.Expr.Le(etran.TrExpr(iea.E1), etran.TrExpr(ieb.E0))); + ex = BplOr(ex, Bpl.Expr.Lt(etran.TrExpr(ieb.E0), etran.TrExpr(iea.E0))); } else { - ex = Bpl.Expr.Or(ex, Bpl.Expr.Le(etran.TrExpr(iea.E1), etran.TrExpr(ieb.E0))); - ex = Bpl.Expr.Or(ex, Bpl.Expr.Le(etran.TrExpr(ieb.E1), etran.TrExpr(iea.E0))); + ex = BplOr(ex, Bpl.Expr.Le(etran.TrExpr(iea.E1), etran.TrExpr(ieb.E0))); + ex = BplOr(ex, Bpl.Expr.Le(etran.TrExpr(ieb.E1), etran.TrExpr(iea.E0))); } return ex; } @@ -3928,7 +3928,7 @@ Bpl.Expr CheckDistinctness(Expression lhsa, Expression lhsb, ExpressionTranslato if (lhsa is MultiSelectExpr iea && lhsb is MultiSelectExpr ieb && iea.Indices.Count == ieb.Indices.Count) { Bpl.Expr ex = Bpl.Expr.Neq(etran.TrExpr(iea.Array), etran.TrExpr(ieb.Array)); for (int i = 0; i < iea.Indices.Count; i++) { - ex = Bpl.Expr.Or(ex, Bpl.Expr.Neq(etran.TrExpr(iea.Indices[i]), etran.TrExpr(ieb.Indices[i]))); + ex = BplOr(ex, Bpl.Expr.Neq(etran.TrExpr(iea.Indices[i]), etran.TrExpr(ieb.Indices[i]))); } return ex; } @@ -4725,7 +4725,7 @@ public static Expression InlineLet(LetExpr letExpr) { } Bpl.Expr HeapSameOrSucc(Bpl.Expr oldHeap, Bpl.Expr newHeap) { - return Bpl.Expr.Or( + return BplOr( Bpl.Expr.Eq(oldHeap, newHeap), FunctionCall(newHeap.tok, BuiltinFunction.HeapSucc, null, oldHeap, newHeap)); } diff --git a/Source/DafnyCore/Verifier/ProofObligationDescription.cs b/Source/DafnyCore/Verifier/ProofObligationDescription.cs index 4cff0ae159..6c0c5460d5 100644 --- a/Source/DafnyCore/Verifier/ProofObligationDescription.cs +++ b/Source/DafnyCore/Verifier/ProofObligationDescription.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; @@ -526,25 +527,81 @@ public TraitDecreases(string whatKind) { } } -public class FrameSubset : ProofObligationDescription { +public class ReadFrameSubset : ProofObligationDescription { public override string SuccessDescription => - isWrite - ? $"{whatKind} is allowed by context's modifies clause" - : $"sufficient reads clause to {whatKind}"; + $"sufficient reads clause to {whatKind}"; public override string FailureDescription => - isWrite - ? $"{whatKind} might violate context's modifies clause" - : $"insufficient reads clause to {whatKind}"; + $"insufficient reads clause to {whatKind}" + ExtendedFailureHint(); - public override string ShortDescription => "frame subset"; + public string ExtendedFailureHint() { + if (readExpression is null) { + return ""; + } + if (scope is { Designator: var designator }) { + var lambdaScope = scope as LambdaExpr; + var extraHint = ""; + var obj = "object"; + if (readExpression is MemberSelectExpr e) { + obj = Printer.ExprToString(DafnyOptions.DefaultImmutableOptions, e.Obj, new PrintFlags(UseOriginalDafnyNames: true)); + } else if (readExpression is SeqSelectExpr s) { + obj = Printer.ExprToString(DafnyOptions.DefaultImmutableOptions, s.Seq, new PrintFlags(UseOriginalDafnyNames: true)); + } else if (readExpression is MultiSelectExpr m) { + obj = Printer.ExprToString(DafnyOptions.DefaultImmutableOptions, m.Array, + new PrintFlags(UseOriginalDafnyNames: true)); + } + + if (scope is Function { CoClusterTarget: var x } && x != Function.CoCallClusterInvolvement.None) { + } else { + if (lambdaScope == null && readExpression is MemberSelectExpr { MemberName: var field }) { + extraHint = $" or 'reads {obj}`{field}'"; + } + var hint = $"adding 'reads {obj}'{extraHint} in the enclosing {designator} specification for resolution"; + if (lambdaScope != null && lambdaScope.Reads.Expressions.Count == 0) { + hint = $"extracting {readExpression} to a local variable before the lambda expression, or {hint}"; + } + + return $"; Consider {hint}"; + } + } + + string whyNotWhat = "Memory locations"; + + if (whatKind == "read field") { + whyNotWhat = "Mutable fields"; + } else if (whatKind is "read array element" or "read the indicated range of array elements") { + whyNotWhat = "Array elements"; + } + return $"; {whyNotWhat} cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls"; + + } + + public override string ShortDescription => "read frame subset"; + + private readonly string whatKind; + private readonly Expression readExpression; + [CanBeNull] private readonly IFrameScope scope; + + public ReadFrameSubset(string whatKind, Expression readExpression = null, [CanBeNull] IFrameScope scope = null) { + this.whatKind = whatKind; + this.readExpression = readExpression; + this.scope = scope; + } +} + +public class ModifyFrameSubset : ProofObligationDescription { + public override string SuccessDescription => + $"{whatKind} is allowed by context's modifies clause"; + + public override string FailureDescription => + $"{whatKind} might violate context's modifies clause"; + + public override string ShortDescription => "modify frame subset"; private readonly string whatKind; - private readonly bool isWrite; - public FrameSubset(string whatKind, bool isWrite) { + public ModifyFrameSubset(string whatKind) { this.whatKind = whatKind; - this.isWrite = isWrite; } } diff --git a/Source/DafnyDriver/CliCompilation.cs b/Source/DafnyDriver/CliCompilation.cs index 5ce3b1c63c..6afcacefa3 100644 --- a/Source/DafnyDriver/CliCompilation.cs +++ b/Source/DafnyDriver/CliCompilation.cs @@ -14,6 +14,7 @@ using Microsoft.Dafny.LanguageServer.Language.Symbols; using Microsoft.Dafny.LanguageServer.Workspace; using Microsoft.Extensions.Logging; +using VC; using Token = Microsoft.Dafny.Token; namespace DafnyDriver.Commands; @@ -24,6 +25,7 @@ public class CliCompilation { public Compilation Compilation { get; } private readonly ConcurrentDictionary errorsPerSource = new(); private int errorCount; + private int warningCount; public bool DidVerification { get; private set; } private CliCompilation( @@ -48,10 +50,13 @@ private CliCompilation( Compilation = createCompilation(executionEngine, input); } - public int ExitCode => (int)ExitValue; + public async Task GetAndReportExitCode() { + var value = await GetAndReportExitValue(); + return (int)value; + } - public ExitValue ExitValue { - get { + public async Task GetAndReportExitValue() { + if (errorCount > 0) { if (HasErrorsFromSource(MessageSource.Project)) { return ExitValue.PREPROCESSING_ERROR; } @@ -59,11 +64,19 @@ public ExitValue ExitValue { if (HasErrorsFromSource(MessageSource.Verifier)) { return ExitValue.VERIFICATION_ERROR; } - return errorCount > 0 ? ExitValue.DAFNY_ERROR : ExitValue.SUCCESS; + return ExitValue.DAFNY_ERROR; + } - bool HasErrorsFromSource(MessageSource source) { - return errorsPerSource.GetOrAdd(source, _ => 0) != 0; - } + if (warningCount > 0 && !Options.Get(CommonOptionBag.AllowWarnings)) { + await Options.OutputWriter.WriteLineAsync( + "Compilation failed because warnings were found and --allow-warnings is false"); + return ExitValue.DAFNY_ERROR; + } + + return ExitValue.SUCCESS; + + bool HasErrorsFromSource(MessageSource source) { + return errorsPerSource.GetOrAdd(source, _ => 0) != 0; } } @@ -105,6 +118,10 @@ public void Start() { (_, previous) => previous + 1); Interlocked.Increment(ref errorCount); } + + if (newDiagnostic.Diagnostic.Level == ErrorLevel.Warning) { + Interlocked.Increment(ref warningCount); + } var dafnyDiagnostic = newDiagnostic.Diagnostic; consoleReporter.Message(dafnyDiagnostic.Source, dafnyDiagnostic.Level, dafnyDiagnostic.ErrorId, dafnyDiagnostic.Token, dafnyDiagnostic.Message); @@ -165,10 +182,13 @@ public async IAsyncEnumerable VerifyAllLazily(int? randomSeed) if (Options.Get(CommonOptionBag.ProgressOption)) { var token = BoogieGenerator.ToDafnyToken(false, boogieUpdate.VerificationTask.Split.Token); + var runResult = completed.Result; + var resourcesUsed = runResult.ResourceCount.ToString("E1", CultureInfo.InvariantCulture); Options.OutputWriter.WriteLine( - $"Verified part {canVerifyResult.CompletedParts.Count}/{canVerifyResult.Tasks.Count} of {boogieUpdate.CanVerify.FullDafnyName}" + - $", on line {token.line} (time: {completed.Result.RunTime.Milliseconds}ms, " + - $"resource count: {completed.Result.ResourceCount.ToString("E1", CultureInfo.InvariantCulture)})"); + $"Verification part {canVerifyResult.CompletedParts.Count}/{canVerifyResult.Tasks.Count} of {boogieUpdate.CanVerify.FullDafnyName}" + + $", on line {token.line}, " + + $"{DescribeOutcome(Compilation.GetOutcome(runResult.Outcome))}" + + $", taking {runResult.RunTime.Milliseconds}ms and consuming {resourcesUsed} resources"); } if (canVerifyResult.CompletedParts.Count == canVerifyResult.Tasks.Count) { canVerifyResult.Finished.TrySetResult(); @@ -244,6 +264,19 @@ public async IAsyncEnumerable VerifyAllLazily(int? randomSeed) } } + public static string DescribeOutcome(VcOutcome outcome) { + return outcome switch { + VcOutcome.Correct => "verified successfully", + VcOutcome.Errors => "could not prove all assertions", + VcOutcome.Inconclusive => "was inconclusive", + VcOutcome.TimedOut => "timed out", + VcOutcome.OutOfResource => "ran out of resources", + VcOutcome.OutOfMemory => "ran out of memory", + VcOutcome.SolverException => "ran into a solver exception", + _ => throw new ArgumentOutOfRangeException(nameof(outcome), outcome, null) + }; + } + private List FilterCanVerifies(List canVerifies, out int? line) { var symbolFilter = Options.Get(VerifyCommand.FilterSymbol); if (symbolFilter != null) { diff --git a/Source/DafnyDriver/Commands/MeasureComplexityCommand.cs b/Source/DafnyDriver/Commands/MeasureComplexityCommand.cs index 0927fdcee4..3eb79d2a6e 100644 --- a/Source/DafnyDriver/Commands/MeasureComplexityCommand.cs +++ b/Source/DafnyDriver/Commands/MeasureComplexityCommand.cs @@ -71,7 +71,7 @@ private static async Task Execute(DafnyOptions options) { await verificationResultsLogged; } - return compilation.ExitCode; + return await compilation.GetAndReportExitCode(); } private static async Task RunVerificationIterations(DafnyOptions options, CliCompilation compilation, diff --git a/Source/DafnyDriver/Commands/ResolveCommand.cs b/Source/DafnyDriver/Commands/ResolveCommand.cs index f0491cd1b4..ec0342164c 100644 --- a/Source/DafnyDriver/Commands/ResolveCommand.cs +++ b/Source/DafnyDriver/Commands/ResolveCommand.cs @@ -17,10 +17,11 @@ public static Command Create() { compilation.Start(); await compilation.Resolution; - if (compilation.ExitValue == ExitValue.SUCCESS) { + var value = await compilation.GetAndReportExitValue(); + if (value == ExitValue.SUCCESS) { await options.OutputWriter.WriteLineAsync("\nDafny program verifier did not attempt verification"); } - return compilation.ExitCode; + return (int)value; }); return result; } diff --git a/Source/DafnyDriver/Commands/VerifyCommand.cs b/Source/DafnyDriver/Commands/VerifyCommand.cs index 7a2212419a..d1270ebc7a 100644 --- a/Source/DafnyDriver/Commands/VerifyCommand.cs +++ b/Source/DafnyDriver/Commands/VerifyCommand.cs @@ -69,7 +69,7 @@ public static async Task HandleVerification(DafnyOptions options) { await verificationResultsLogged; } - return compilation.ExitCode; + return await compilation.GetAndReportExitCode(); } public static async Task ReportVerificationSummary( CliCompilation cliCompilation, @@ -163,7 +163,7 @@ public static void ReportVerificationDiagnostics(CliCompilation compilation, IOb // We use an intermediate reporter so we can sort the diagnostics from all parts by token var batchReporter = new BatchErrorReporter(compilation.Options); foreach (var completed in result.Results) { - Compilation.ReportDiagnosticsInResult(compilation.Options, result.CanVerify.FullDafnyName, result.CanVerify.NameToken, + Compilation.ReportDiagnosticsInResult(compilation.Options, result.CanVerify.FullDafnyName, completed.Task.Token, (uint)completed.Result.RunTime.Seconds, completed.Result, batchReporter); } diff --git a/Source/DafnyDriver/DafnyNewCli.cs b/Source/DafnyDriver/DafnyNewCli.cs index 5497dfe02e..274681cfaa 100644 --- a/Source/DafnyDriver/DafnyNewCli.cs +++ b/Source/DafnyDriver/DafnyNewCli.cs @@ -224,11 +224,7 @@ private static async Task ProcessProjectFile(DafnyOptions dafnyOptions, Fi foreach (var diagnostic in projectFile.Errors.AllMessages) { var message = $"{diagnostic.Level}: {diagnostic.Message}"; - if (diagnostic.Level == ErrorLevel.Error) { - await dafnyOptions.ErrorWriter.WriteLineAsync(message); - } else { - await dafnyOptions.OutputWriter.WriteLineAsync(message); - } + await dafnyOptions.OutputWriter.WriteLineAsync(message); } projectFile.Validate(dafnyOptions.OutputWriter, AllOptions); diff --git a/Source/DafnyLanguageServer.Test/Util/ClientBasedLanguageServerTest.cs b/Source/DafnyLanguageServer.Test/Util/ClientBasedLanguageServerTest.cs index 88fc061f95..3cbecd6617 100644 --- a/Source/DafnyLanguageServer.Test/Util/ClientBasedLanguageServerTest.cs +++ b/Source/DafnyLanguageServer.Test/Util/ClientBasedLanguageServerTest.cs @@ -176,7 +176,7 @@ protected async Task WaitUntilAllStatusAreCompleted(Text bool allowStale = false) { cancellationToken ??= CancellationToken; - if ((!await WaitUntilResolutionFinished(documentId, cancellationToken))) { + if ((!await WaitUntilResolutionFinished(documentId, cancellationToken.Value))) { return null; } @@ -198,11 +198,13 @@ bool FinishedStatus(NamedVerifiableStatus method) { } } - public async Task WaitUntilResolutionFinished(TextDocumentItem documentId, CancellationToken? cancellationToken) { + public async Task WaitUntilResolutionFinished(TextDocumentItem documentId, + CancellationToken cancellationToken = default) { + CompilationStatusParams compilationStatusParams = compilationStatusReceiver.GetLast(s => s.Uri == documentId.Uri); while (compilationStatusParams == null || compilationStatusParams.Version != documentId.Version || compilationStatusParams.Uri != documentId.Uri || compilationStatusParams.Status is CompilationStatus.Parsing or CompilationStatus.ResolutionStarted) { - compilationStatusParams = await compilationStatusReceiver.AwaitNextNotificationAsync(cancellationToken.Value); + compilationStatusParams = await compilationStatusReceiver.AwaitNextNotificationAsync(cancellationToken); } return compilationStatusParams.Status == CompilationStatus.ResolutionSucceeded; diff --git a/Source/DafnyLanguageServer.Test/Util/TestNotificationReceiver.cs b/Source/DafnyLanguageServer.Test/Util/TestNotificationReceiver.cs index 49f49f724e..b156adf4b5 100644 --- a/Source/DafnyLanguageServer.Test/Util/TestNotificationReceiver.cs +++ b/Source/DafnyLanguageServer.Test/Util/TestNotificationReceiver.cs @@ -55,13 +55,15 @@ public async Task AwaitNextNotificationAsync(CancellationToken ca try { await availableNotifications.WaitAsync(cancellationToken); } catch (OperationCanceledException) { - logger.LogInformation($"Waited for {(DateTime.Now - start).Seconds} seconds"); + var last = History.Any() ? History[-1].Stringify() : "none"; + logger.LogInformation($"Waited for {(DateTime.Now - start).Seconds} seconds for new notification.\n" + + $"Last received notification was {last}"); throw; } if (notifications.TryDequeue(out var notification)) { return notification; } - throw new System.InvalidOperationException("got a signal for a received notification but it was not present in the queue"); + throw new InvalidOperationException("got a signal for a received notification but it was not present in the queue"); } } } diff --git a/Source/DafnyPipeline.Test/expectedProverLog.smt2 b/Source/DafnyPipeline.Test/expectedProverLog.smt2 index 99a6869bf0..cff4b0e4b6 100644 --- a/Source/DafnyPipeline.Test/expectedProverLog.smt2 +++ b/Source/DafnyPipeline.Test/expectedProverLog.smt2 @@ -1105,34 +1105,34 @@ $generated@@442)))))))) (declare-fun $generated@@45 (T@T) T@T) (declare-fun $generated@@46 (T@T) T@T) (declare-fun $generated@@70 (T@U) T@U) -(declare-fun $generated@@77 (T@U T@U) T@U) -(declare-fun $generated@@85 (T@U T@U) T@U) -(declare-fun $generated@@90 (T@U) T@U) -(declare-fun $generated@@96 (T@U T@U T@U T@U T@U) T@U) -(declare-fun $generated@@97 () T@U) -(declare-fun $generated@@98 (T@U T@U) Bool) -(declare-fun $generated@@99 () T@U) -(declare-fun $generated@@105 (T@U T@U) T@U) -(declare-fun $generated@@110 (T@U) T@U) -(declare-fun $generated@@112 (T@T T@U) T@U) -(declare-fun $generated@@113 (T@T T@U) T@U) -(declare-fun $generated@@124 (T@U T@U T@U) Bool) -(declare-fun $generated@@136 (T@U T@U T@U T@U T@U) T@U) -(declare-fun $generated@@159 () T@T) -(declare-fun $generated@@160 () T@U) -(declare-fun $generated@@161 () T@T) +(declare-fun $generated@@74 (T@U T@U) T@U) +(declare-fun $generated@@82 (T@U T@U) T@U) +(declare-fun $generated@@87 (T@U) T@U) +(declare-fun $generated@@93 (T@U T@U T@U T@U T@U) T@U) +(declare-fun $generated@@94 () T@U) +(declare-fun $generated@@95 (T@U T@U) Bool) +(declare-fun $generated@@96 () T@U) +(declare-fun $generated@@102 (T@U T@U) T@U) +(declare-fun $generated@@107 (T@U) T@U) +(declare-fun $generated@@109 (T@T T@U) T@U) +(declare-fun $generated@@110 (T@T T@U) T@U) +(declare-fun $generated@@121 (T@U T@U T@U) Bool) +(declare-fun $generated@@133 (T@U T@U T@U T@U T@U) T@U) +(declare-fun $generated@@156 () T@T) +(declare-fun $generated@@157 () T@U) +(declare-fun $generated@@158 () T@T) +(declare-fun $generated@@169 (T@U) T@U) (declare-fun $generated@@172 (T@U) T@U) (declare-fun $generated@@175 (T@U) T@U) (declare-fun $generated@@178 (T@U) T@U) -(declare-fun $generated@@181 (T@U) T@U) +(declare-fun $generated@@183 (T@U) T@U) (declare-fun $generated@@186 (T@U) T@U) -(declare-fun $generated@@189 (T@U) T@U) -(declare-fun $generated@@196 (T@U) T@U) -(declare-fun $generated@@201 (T@U) Int) -(declare-fun $generated@@219 (T@T T@T T@T T@U T@U T@U) T@U) -(declare-fun $generated@@220 (T@U T@U T@U Bool) T@U) -(declare-fun $generated@@221 (T@T T@T T@T T@U T@U T@U T@U) T@U) -(declare-fun $generated@@253 (T@U) T@U) +(declare-fun $generated@@193 (T@U) T@U) +(declare-fun $generated@@198 (T@U) Int) +(declare-fun $generated@@216 (T@T T@T T@T T@U T@U T@U) T@U) +(declare-fun $generated@@217 (T@U T@U T@U Bool) T@U) +(declare-fun $generated@@218 (T@T T@T T@T T@U T@U T@U T@U) T@U) +(declare-fun $generated@@250 (T@U) T@U) (assert (and (and (and (and (and (and (and (and (= ($generated@@10 $generated@@11) 0) (= ($generated@@10 $generated@@12) 1)) (= ($generated@@10 $generated@@13) 2)) (forall (($generated@@20 Bool) ) (! (= ($generated@@15 ($generated@@14 $generated@@20)) $generated@@20) :pattern ( ($generated@@14 $generated@@20)) ))) (forall (($generated@@21 T@U) ) (! (= ($generated@@14 ($generated@@15 $generated@@21)) $generated@@21) @@ -1168,214 +1168,211 @@ $generated@@442)))))))) :pattern ( ($generated@@27 $generated@@64 $generated@@65 ($generated@@28 $generated@@29 $generated@@67)) ($generated@@30 $generated@@66)) )))) (assert (= ($generated@@70 $generated) $generated@@0)) -(assert (=> (<= 0 $generated@@26) (forall (($generated@@71 T@U) ($generated@@72 T@U) ($generated@@73 T@U) ) (! (=> (or ($generated@@31 $generated@@71 $generated@@72 $generated@@73) (and (< 0 $generated@@26) ($generated@@32 $generated@@29 $generated@@73 ($generated@@33 $generated@@71 $generated@@72)))) true) - :pattern ( ($generated@@27 $generated@@71 $generated@@72 $generated@@73)) -)))) -(assert (forall (($generated@@74 T@U) ($generated@@75 T@U) ($generated@@76 T@U) ) (! (=> ($generated@@32 $generated@@29 $generated@@76 ($generated@@33 $generated@@74 $generated@@75)) ($generated@@41 $generated@@76)) - :pattern ( ($generated@@41 $generated@@76) ($generated@@32 $generated@@29 $generated@@76 ($generated@@33 $generated@@74 $generated@@75))) +(assert (forall (($generated@@71 T@U) ($generated@@72 T@U) ($generated@@73 T@U) ) (! (=> ($generated@@32 $generated@@29 $generated@@73 ($generated@@33 $generated@@71 $generated@@72)) ($generated@@41 $generated@@73)) + :pattern ( ($generated@@41 $generated@@73) ($generated@@32 $generated@@29 $generated@@73 ($generated@@33 $generated@@71 $generated@@72))) ))) -(assert (forall (($generated@@78 T@U) ($generated@@79 T@U) ($generated@@80 T@U) ($generated@@81 T@U) ($generated@@82 T@U) ) (! (=> (and (and ($generated@@32 $generated@@43 $generated@@78 ($generated@@77 $generated@@79 $generated@@80)) (forall (($generated@@83 T@U) ) (! (=> ($generated@@40 $generated@@83 $generated@@81) ($generated@@40 $generated@@83 $generated@@79)) - :pattern ( ($generated@@40 $generated@@83 $generated@@81)) - :pattern ( ($generated@@40 $generated@@83 $generated@@79)) -))) (forall (($generated@@84 T@U) ) (! (=> ($generated@@40 $generated@@84 $generated@@80) ($generated@@40 $generated@@84 $generated@@82)) - :pattern ( ($generated@@40 $generated@@84 $generated@@80)) - :pattern ( ($generated@@40 $generated@@84 $generated@@82)) -))) ($generated@@32 $generated@@43 $generated@@78 ($generated@@77 $generated@@81 $generated@@82))) - :pattern ( ($generated@@32 $generated@@43 $generated@@78 ($generated@@77 $generated@@79 $generated@@80)) ($generated@@32 $generated@@43 $generated@@78 ($generated@@77 $generated@@81 $generated@@82))) +(assert (forall (($generated@@75 T@U) ($generated@@76 T@U) ($generated@@77 T@U) ($generated@@78 T@U) ($generated@@79 T@U) ) (! (=> (and (and ($generated@@32 $generated@@43 $generated@@75 ($generated@@74 $generated@@76 $generated@@77)) (forall (($generated@@80 T@U) ) (! (=> ($generated@@40 $generated@@80 $generated@@78) ($generated@@40 $generated@@80 $generated@@76)) + :pattern ( ($generated@@40 $generated@@80 $generated@@78)) + :pattern ( ($generated@@40 $generated@@80 $generated@@76)) +))) (forall (($generated@@81 T@U) ) (! (=> ($generated@@40 $generated@@81 $generated@@77) ($generated@@40 $generated@@81 $generated@@79)) + :pattern ( ($generated@@40 $generated@@81 $generated@@77)) + :pattern ( ($generated@@40 $generated@@81 $generated@@79)) +))) ($generated@@32 $generated@@43 $generated@@75 ($generated@@74 $generated@@78 $generated@@79))) + :pattern ( ($generated@@32 $generated@@43 $generated@@75 ($generated@@74 $generated@@76 $generated@@77)) ($generated@@32 $generated@@43 $generated@@75 ($generated@@74 $generated@@78 $generated@@79))) ))) -(assert (forall (($generated@@86 T@U) ($generated@@87 T@U) ($generated@@88 T@U) ($generated@@89 T@U) ) (! (=> (and ($generated@@30 $generated@@89) (and ($generated@@41 $generated@@86) ($generated@@34 $generated@@29 $generated@@86 ($generated@@33 $generated@@87 $generated@@88) $generated@@89))) ($generated@@34 $generated@@43 ($generated@@36 $generated@@86) ($generated@@85 $generated@@87 $generated@@88) $generated@@89)) - :pattern ( ($generated@@34 $generated@@43 ($generated@@36 $generated@@86) ($generated@@85 $generated@@87 $generated@@88) $generated@@89)) +(assert (forall (($generated@@83 T@U) ($generated@@84 T@U) ($generated@@85 T@U) ($generated@@86 T@U) ) (! (=> (and ($generated@@30 $generated@@86) (and ($generated@@41 $generated@@83) ($generated@@34 $generated@@29 $generated@@83 ($generated@@33 $generated@@84 $generated@@85) $generated@@86))) ($generated@@34 $generated@@43 ($generated@@36 $generated@@83) ($generated@@82 $generated@@84 $generated@@85) $generated@@86)) + :pattern ( ($generated@@34 $generated@@43 ($generated@@36 $generated@@83) ($generated@@82 $generated@@84 $generated@@85) $generated@@86)) ))) -(assert (forall (($generated@@91 T@U) ($generated@@92 T@U) ) (! (= ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@91 ($generated@@90 $generated@@92)) (forall (($generated@@93 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@91 $generated@@93)) ($generated@@40 $generated@@93 $generated@@92)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@91 $generated@@93)) +(assert (forall (($generated@@88 T@U) ($generated@@89 T@U) ) (! (= ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@88 ($generated@@87 $generated@@89)) (forall (($generated@@90 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@88 $generated@@90)) ($generated@@40 $generated@@90 $generated@@89)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@88 $generated@@90)) ))) - :pattern ( ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@91 ($generated@@90 $generated@@92))) + :pattern ( ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@88 ($generated@@87 $generated@@89))) ))) -(assert (forall (($generated@@94 T@U) ($generated@@95 T@T) ) (! (= ($generated@@28 $generated@@95 $generated@@94) $generated@@94) - :pattern ( ($generated@@28 $generated@@95 $generated@@94)) +(assert (forall (($generated@@91 T@U) ($generated@@92 T@T) ) (! (= ($generated@@28 $generated@@92 $generated@@91) $generated@@91) + :pattern ( ($generated@@28 $generated@@92 $generated@@91)) ))) -(assert (forall (($generated@@100 T@U) ($generated@@101 T@U) ($generated@@102 T@U) ($generated@@103 T@U) ($generated@@104 T@U) ) (! (=> (and ($generated@@30 $generated@@102) (and ($generated@@40 $generated@@104 $generated@@100) ($generated@@32 $generated@@43 $generated@@103 ($generated@@77 $generated@@100 $generated@@101)))) (= ($generated@@98 ($generated@@96 $generated@@100 $generated@@101 $generated@@97 $generated@@103 $generated@@104) $generated@@99) ($generated@@98 ($generated@@96 $generated@@100 $generated@@101 $generated@@102 $generated@@103 $generated@@104) $generated@@99))) - :pattern ( ($generated@@96 $generated@@100 $generated@@101 $generated@@97 $generated@@103 $generated@@104) ($generated@@30 $generated@@102)) - :pattern ( ($generated@@96 $generated@@100 $generated@@101 $generated@@102 $generated@@103 $generated@@104)) +(assert (forall (($generated@@97 T@U) ($generated@@98 T@U) ($generated@@99 T@U) ($generated@@100 T@U) ($generated@@101 T@U) ) (! (=> (and ($generated@@30 $generated@@99) (and ($generated@@40 $generated@@101 $generated@@97) ($generated@@32 $generated@@43 $generated@@100 ($generated@@74 $generated@@97 $generated@@98)))) (= ($generated@@95 ($generated@@93 $generated@@97 $generated@@98 $generated@@94 $generated@@100 $generated@@101) $generated@@96) ($generated@@95 ($generated@@93 $generated@@97 $generated@@98 $generated@@99 $generated@@100 $generated@@101) $generated@@96))) + :pattern ( ($generated@@93 $generated@@97 $generated@@98 $generated@@94 $generated@@100 $generated@@101) ($generated@@30 $generated@@99)) + :pattern ( ($generated@@93 $generated@@97 $generated@@98 $generated@@99 $generated@@100 $generated@@101)) ))) -(assert (forall (($generated@@106 T@U) ($generated@@107 T@U) ($generated@@108 T@U) ($generated@@109 T@U) ) (! (= ($generated@@32 $generated@@29 ($generated@@105 $generated@@108 $generated@@109) ($generated@@33 $generated@@106 $generated@@107)) (and ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@108 ($generated@@90 $generated@@106)) ($generated@@32 $generated@@43 $generated@@109 ($generated@@85 $generated@@106 $generated@@107)))) - :pattern ( ($generated@@32 $generated@@29 ($generated@@105 $generated@@108 $generated@@109) ($generated@@33 $generated@@106 $generated@@107))) +(assert (forall (($generated@@103 T@U) ($generated@@104 T@U) ($generated@@105 T@U) ($generated@@106 T@U) ) (! (= ($generated@@32 $generated@@29 ($generated@@102 $generated@@105 $generated@@106) ($generated@@33 $generated@@103 $generated@@104)) (and ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) $generated@@105 ($generated@@87 $generated@@103)) ($generated@@32 $generated@@43 $generated@@106 ($generated@@82 $generated@@103 $generated@@104)))) + :pattern ( ($generated@@32 $generated@@29 ($generated@@102 $generated@@105 $generated@@106) ($generated@@33 $generated@@103 $generated@@104))) ))) -(assert (forall (($generated@@111 T@U) ) (! (= ($generated@@41 $generated@@111) (= ($generated@@110 $generated@@111) $generated@@5)) - :pattern ( ($generated@@41 $generated@@111)) +(assert (forall (($generated@@108 T@U) ) (! (= ($generated@@41 $generated@@108) (= ($generated@@107 $generated@@108) $generated@@5)) + :pattern ( ($generated@@41 $generated@@108)) ))) -(assert (forall (($generated@@114 T@U) ($generated@@115 T@T) ) (! (= ($generated@@113 $generated@@115 ($generated@@112 $generated@@115 $generated@@114)) $generated@@114) - :pattern ( ($generated@@112 $generated@@115 $generated@@114)) +(assert (forall (($generated@@111 T@U) ($generated@@112 T@T) ) (! (= ($generated@@110 $generated@@112 ($generated@@109 $generated@@112 $generated@@111)) $generated@@111) + :pattern ( ($generated@@109 $generated@@112 $generated@@111)) ))) -(assert (forall (($generated@@116 T@U) ) (! (=> ($generated@@41 $generated@@116) (exists (($generated@@117 T@U) ($generated@@118 T@U) ) (= $generated@@116 ($generated@@105 $generated@@117 $generated@@118)))) - :pattern ( ($generated@@41 $generated@@116)) +(assert (forall (($generated@@113 T@U) ) (! (=> ($generated@@41 $generated@@113) (exists (($generated@@114 T@U) ($generated@@115 T@U) ) (= $generated@@113 ($generated@@102 $generated@@114 $generated@@115)))) + :pattern ( ($generated@@41 $generated@@113)) ))) -(assert (forall (($generated@@119 T@U) ($generated@@120 T@U) ($generated@@121 T@U) ($generated@@122 T@U) ($generated@@123 T@U) ) (! (=> ($generated@@30 $generated@@123) (= ($generated@@34 $generated@@29 ($generated@@105 $generated@@121 $generated@@122) ($generated@@33 $generated@@119 $generated@@120) $generated@@123) (and ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@121 ($generated@@90 $generated@@119) $generated@@123) ($generated@@34 $generated@@43 $generated@@122 ($generated@@85 $generated@@119 $generated@@120) $generated@@123)))) - :pattern ( ($generated@@34 $generated@@29 ($generated@@105 $generated@@121 $generated@@122) ($generated@@33 $generated@@119 $generated@@120) $generated@@123)) +(assert (forall (($generated@@116 T@U) ($generated@@117 T@U) ($generated@@118 T@U) ($generated@@119 T@U) ($generated@@120 T@U) ) (! (=> ($generated@@30 $generated@@120) (= ($generated@@34 $generated@@29 ($generated@@102 $generated@@118 $generated@@119) ($generated@@33 $generated@@116 $generated@@117) $generated@@120) (and ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@118 ($generated@@87 $generated@@116) $generated@@120) ($generated@@34 $generated@@43 $generated@@119 ($generated@@82 $generated@@116 $generated@@117) $generated@@120)))) + :pattern ( ($generated@@34 $generated@@29 ($generated@@102 $generated@@118 $generated@@119) ($generated@@33 $generated@@116 $generated@@117) $generated@@120)) ))) -(assert ($generated@@30 $generated@@97)) -(assert (forall (($generated@@125 T@U) ($generated@@126 T@U) ($generated@@127 T@U) ($generated@@128 T@T) ) (! (= ($generated@@124 ($generated@@113 $generated@@128 $generated@@125) $generated@@126 $generated@@127) ($generated@@34 $generated@@128 $generated@@125 $generated@@126 $generated@@127)) - :pattern ( ($generated@@124 ($generated@@113 $generated@@128 $generated@@125) $generated@@126 $generated@@127)) +(assert ($generated@@30 $generated@@94)) +(assert (forall (($generated@@122 T@U) ($generated@@123 T@U) ($generated@@124 T@U) ($generated@@125 T@T) ) (! (= ($generated@@121 ($generated@@110 $generated@@125 $generated@@122) $generated@@123 $generated@@124) ($generated@@34 $generated@@125 $generated@@122 $generated@@123 $generated@@124)) + :pattern ( ($generated@@121 ($generated@@110 $generated@@125 $generated@@122) $generated@@123 $generated@@124)) ))) -(assert (forall (($generated@@129 T@U) ($generated@@130 T@U) ) (! (= ($generated@@98 $generated@@129 $generated@@130) (forall (($generated@@131 T@U) ) (! (= ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@129 $generated@@131)) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@130 $generated@@131))) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@129 $generated@@131)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@130 $generated@@131)) +(assert (forall (($generated@@126 T@U) ($generated@@127 T@U) ) (! (= ($generated@@95 $generated@@126 $generated@@127) (forall (($generated@@128 T@U) ) (! (= ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@126 $generated@@128)) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@127 $generated@@128))) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@126 $generated@@128)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@127 $generated@@128)) ))) - :pattern ( ($generated@@98 $generated@@129 $generated@@130)) + :pattern ( ($generated@@95 $generated@@126 $generated@@127)) ))) -(assert (forall (($generated@@132 T@U) ($generated@@133 T@U) ($generated@@134 T@U) ($generated@@135 T@U) ) (! (= ($generated@@34 $generated@@43 $generated@@134 ($generated@@85 $generated@@132 $generated@@133) $generated@@135) ($generated@@34 $generated@@43 $generated@@134 ($generated@@77 $generated@@132 $generated@@133) $generated@@135)) - :pattern ( ($generated@@34 $generated@@43 $generated@@134 ($generated@@85 $generated@@132 $generated@@133) $generated@@135)) +(assert (forall (($generated@@129 T@U) ($generated@@130 T@U) ($generated@@131 T@U) ($generated@@132 T@U) ) (! (= ($generated@@34 $generated@@43 $generated@@131 ($generated@@82 $generated@@129 $generated@@130) $generated@@132) ($generated@@34 $generated@@43 $generated@@131 ($generated@@74 $generated@@129 $generated@@130) $generated@@132)) + :pattern ( ($generated@@34 $generated@@43 $generated@@131 ($generated@@82 $generated@@129 $generated@@130) $generated@@132)) ))) -(assert (forall (($generated@@137 T@U) ($generated@@138 T@U) ($generated@@139 T@U) ($generated@@140 T@U) ) (! (=> (and ($generated@@30 $generated@@140) ($generated@@34 $generated@@43 $generated@@137 ($generated@@77 $generated@@138 $generated@@139) $generated@@140)) (forall (($generated@@141 T@U) ) (! (=> (and ($generated@@124 $generated@@141 $generated@@138 $generated@@140) ($generated@@35 $generated@@138 $generated@@139 $generated@@140 $generated@@137 $generated@@141)) ($generated@@124 ($generated@@136 $generated@@138 $generated@@139 $generated@@140 $generated@@137 $generated@@141) $generated@@139 $generated@@140)) - :pattern ( ($generated@@136 $generated@@138 $generated@@139 $generated@@140 $generated@@137 $generated@@141)) +(assert (forall (($generated@@134 T@U) ($generated@@135 T@U) ($generated@@136 T@U) ($generated@@137 T@U) ) (! (=> (and ($generated@@30 $generated@@137) ($generated@@34 $generated@@43 $generated@@134 ($generated@@74 $generated@@135 $generated@@136) $generated@@137)) (forall (($generated@@138 T@U) ) (! (=> (and ($generated@@121 $generated@@138 $generated@@135 $generated@@137) ($generated@@35 $generated@@135 $generated@@136 $generated@@137 $generated@@134 $generated@@138)) ($generated@@121 ($generated@@133 $generated@@135 $generated@@136 $generated@@137 $generated@@134 $generated@@138) $generated@@136 $generated@@137)) + :pattern ( ($generated@@133 $generated@@135 $generated@@136 $generated@@137 $generated@@134 $generated@@138)) ))) - :pattern ( ($generated@@34 $generated@@43 $generated@@137 ($generated@@77 $generated@@138 $generated@@139) $generated@@140)) + :pattern ( ($generated@@34 $generated@@43 $generated@@134 ($generated@@74 $generated@@135 $generated@@136) $generated@@137)) ))) -(assert (forall (($generated@@142 T@U) ($generated@@143 T@U) ($generated@@144 T@U) ) (! (= ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@142 ($generated@@90 $generated@@143) $generated@@144) (forall (($generated@@145 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@142 $generated@@145)) ($generated@@124 $generated@@145 $generated@@143 $generated@@144)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@142 $generated@@145)) +(assert (forall (($generated@@139 T@U) ($generated@@140 T@U) ($generated@@141 T@U) ) (! (= ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@139 ($generated@@87 $generated@@140) $generated@@141) (forall (($generated@@142 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@139 $generated@@142)) ($generated@@121 $generated@@142 $generated@@140 $generated@@141)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@139 $generated@@142)) ))) - :pattern ( ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@142 ($generated@@90 $generated@@143) $generated@@144)) + :pattern ( ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) $generated@@139 ($generated@@87 $generated@@140) $generated@@141)) ))) -(assert (forall (($generated@@146 T@U) ($generated@@147 T@U) ) (! (=> ($generated@@98 $generated@@146 $generated@@147) (= $generated@@146 $generated@@147)) - :pattern ( ($generated@@98 $generated@@146 $generated@@147)) +(assert (forall (($generated@@143 T@U) ($generated@@144 T@U) ) (! (=> ($generated@@95 $generated@@143 $generated@@144) (= $generated@@143 $generated@@144)) + :pattern ( ($generated@@95 $generated@@143 $generated@@144)) ))) -(assert (=> (<= 0 $generated@@26) (forall (($generated@@148 T@U) ($generated@@149 T@U) ($generated@@150 T@U) ($generated@@151 T@U) ) (! (=> (or ($generated@@31 $generated@@148 $generated@@149 $generated@@151) (and (< 0 $generated@@26) (and ($generated@@30 $generated@@150) (and ($generated@@32 $generated@@29 $generated@@151 ($generated@@33 $generated@@148 $generated@@149)) ($generated@@34 $generated@@29 $generated@@151 ($generated@@33 $generated@@148 $generated@@149) $generated@@150))))) (and (forall (($generated@@152 T@U) ) (! (=> ($generated@@40 $generated@@152 $generated@@148) (and ($generated@@41 $generated@@151) (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@151) $generated@@152)) (and ($generated@@41 $generated@@151) true)))) - :pattern ( ($generated@@35 $generated@@148 $generated@@149 $generated@@150 ($generated@@36 $generated@@151) $generated@@152)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@151) $generated@@152)) -)) (= ($generated@@27 $generated@@148 $generated@@149 $generated@@151) (forall (($generated@@153 T@U) ) (! (=> (and ($generated@@40 $generated@@153 $generated@@148) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@151) $generated@@153))) ($generated@@35 $generated@@148 $generated@@149 $generated@@150 ($generated@@36 $generated@@151) $generated@@153)) - :pattern ( ($generated@@35 $generated@@148 $generated@@149 $generated@@150 ($generated@@36 $generated@@151) $generated@@153)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@151) $generated@@153)) +(assert (=> (<= 0 $generated@@26) (forall (($generated@@145 T@U) ($generated@@146 T@U) ($generated@@147 T@U) ($generated@@148 T@U) ) (! (=> (or ($generated@@31 $generated@@145 $generated@@146 $generated@@148) (and (< 0 $generated@@26) (and ($generated@@30 $generated@@147) (and ($generated@@32 $generated@@29 $generated@@148 ($generated@@33 $generated@@145 $generated@@146)) ($generated@@34 $generated@@29 $generated@@148 ($generated@@33 $generated@@145 $generated@@146) $generated@@147))))) (and (forall (($generated@@149 T@U) ) (! (=> ($generated@@40 $generated@@149 $generated@@145) (and ($generated@@41 $generated@@148) (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@148) $generated@@149)) (and ($generated@@41 $generated@@148) true)))) + :pattern ( ($generated@@35 $generated@@145 $generated@@146 $generated@@147 ($generated@@36 $generated@@148) $generated@@149)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@148) $generated@@149)) +)) (= ($generated@@27 $generated@@145 $generated@@146 $generated@@148) (forall (($generated@@150 T@U) ) (! (=> (and ($generated@@40 $generated@@150 $generated@@145) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@148) $generated@@150))) ($generated@@35 $generated@@145 $generated@@146 $generated@@147 ($generated@@36 $generated@@148) $generated@@150)) + :pattern ( ($generated@@35 $generated@@145 $generated@@146 $generated@@147 ($generated@@36 $generated@@148) $generated@@150)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@148) $generated@@150)) ))))) - :pattern ( ($generated@@27 $generated@@148 $generated@@149 $generated@@151) ($generated@@30 $generated@@150)) + :pattern ( ($generated@@27 $generated@@145 $generated@@146 $generated@@148) ($generated@@30 $generated@@147)) )))) -(assert (forall (($generated@@154 T@U) ($generated@@155 T@U) ($generated@@156 T@U) ) (! (= ($generated@@32 $generated@@43 $generated@@154 ($generated@@77 $generated@@155 $generated@@156)) (forall (($generated@@157 T@U) ($generated@@158 T@U) ) (! (=> (and (and ($generated@@30 $generated@@157) ($generated@@40 $generated@@158 $generated@@155)) ($generated@@35 $generated@@155 $generated@@156 $generated@@157 $generated@@154 $generated@@158)) ($generated@@40 ($generated@@136 $generated@@155 $generated@@156 $generated@@157 $generated@@154 $generated@@158) $generated@@156)) - :pattern ( ($generated@@136 $generated@@155 $generated@@156 $generated@@157 $generated@@154 $generated@@158)) +(assert (forall (($generated@@151 T@U) ($generated@@152 T@U) ($generated@@153 T@U) ) (! (= ($generated@@32 $generated@@43 $generated@@151 ($generated@@74 $generated@@152 $generated@@153)) (forall (($generated@@154 T@U) ($generated@@155 T@U) ) (! (=> (and (and ($generated@@30 $generated@@154) ($generated@@40 $generated@@155 $generated@@152)) ($generated@@35 $generated@@152 $generated@@153 $generated@@154 $generated@@151 $generated@@155)) ($generated@@40 ($generated@@133 $generated@@152 $generated@@153 $generated@@154 $generated@@151 $generated@@155) $generated@@153)) + :pattern ( ($generated@@133 $generated@@152 $generated@@153 $generated@@154 $generated@@151 $generated@@155)) ))) - :pattern ( ($generated@@32 $generated@@43 $generated@@154 ($generated@@77 $generated@@155 $generated@@156))) + :pattern ( ($generated@@32 $generated@@43 $generated@@151 ($generated@@74 $generated@@152 $generated@@153))) ))) -(assert (and (= ($generated@@10 $generated@@159) 7) (= ($generated@@10 $generated@@161) 8))) -(assert (forall (($generated@@162 T@U) ($generated@@163 T@U) ($generated@@164 T@U) ($generated@@165 T@U) ) (! (=> ($generated@@30 $generated@@165) (= ($generated@@34 $generated@@43 $generated@@162 ($generated@@77 $generated@@163 $generated@@164) $generated@@165) (forall (($generated@@166 T@U) ) (! (=> (and (and ($generated@@40 $generated@@166 $generated@@163) ($generated@@124 $generated@@166 $generated@@163 $generated@@165)) ($generated@@35 $generated@@163 $generated@@164 $generated@@165 $generated@@162 $generated@@166)) (forall (($generated@@167 T@U) ) (! (=> (and (or (not (= $generated@@167 $generated@@160)) (not true)) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@96 $generated@@163 $generated@@164 $generated@@165 $generated@@162 $generated@@166) ($generated@@113 $generated@@159 $generated@@167)))) ($generated@@15 ($generated@@112 $generated@@11 ($generated@@37 $generated@@161 $generated@@38 ($generated@@37 $generated@@159 ($generated@@42 $generated@@161 $generated@@38) $generated@@165 $generated@@167) $generated@@2)))) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@96 $generated@@163 $generated@@164 $generated@@165 $generated@@162 $generated@@166) ($generated@@113 $generated@@159 $generated@@167))) +(assert (and (= ($generated@@10 $generated@@156) 7) (= ($generated@@10 $generated@@158) 8))) +(assert (forall (($generated@@159 T@U) ($generated@@160 T@U) ($generated@@161 T@U) ($generated@@162 T@U) ) (! (=> ($generated@@30 $generated@@162) (= ($generated@@34 $generated@@43 $generated@@159 ($generated@@74 $generated@@160 $generated@@161) $generated@@162) (forall (($generated@@163 T@U) ) (! (=> (and (and ($generated@@40 $generated@@163 $generated@@160) ($generated@@121 $generated@@163 $generated@@160 $generated@@162)) ($generated@@35 $generated@@160 $generated@@161 $generated@@162 $generated@@159 $generated@@163)) (forall (($generated@@164 T@U) ) (! (=> (and (or (not (= $generated@@164 $generated@@157)) (not true)) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@93 $generated@@160 $generated@@161 $generated@@162 $generated@@159 $generated@@163) ($generated@@110 $generated@@156 $generated@@164)))) ($generated@@15 ($generated@@109 $generated@@11 ($generated@@37 $generated@@158 $generated@@38 ($generated@@37 $generated@@156 ($generated@@42 $generated@@158 $generated@@38) $generated@@162 $generated@@164) $generated@@2)))) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@93 $generated@@160 $generated@@161 $generated@@162 $generated@@159 $generated@@163) ($generated@@110 $generated@@156 $generated@@164))) ))) - :pattern ( ($generated@@136 $generated@@163 $generated@@164 $generated@@165 $generated@@162 $generated@@166)) - :pattern ( ($generated@@96 $generated@@163 $generated@@164 $generated@@165 $generated@@162 $generated@@166)) + :pattern ( ($generated@@133 $generated@@160 $generated@@161 $generated@@162 $generated@@159 $generated@@163)) + :pattern ( ($generated@@93 $generated@@160 $generated@@161 $generated@@162 $generated@@159 $generated@@163)) )))) - :pattern ( ($generated@@34 $generated@@43 $generated@@162 ($generated@@77 $generated@@163 $generated@@164) $generated@@165)) + :pattern ( ($generated@@34 $generated@@43 $generated@@159 ($generated@@74 $generated@@160 $generated@@161) $generated@@162)) ))) -(assert (forall (($generated@@168 T@U) ) (! (=> ($generated@@40 $generated@@168 $generated) (and (= ($generated@@113 $generated@@11 ($generated@@112 $generated@@11 $generated@@168)) $generated@@168) ($generated@@32 $generated@@11 ($generated@@112 $generated@@11 $generated@@168) $generated))) - :pattern ( ($generated@@40 $generated@@168 $generated)) +(assert (forall (($generated@@165 T@U) ) (! (=> ($generated@@40 $generated@@165 $generated) (and (= ($generated@@110 $generated@@11 ($generated@@109 $generated@@11 $generated@@165)) $generated@@165) ($generated@@32 $generated@@11 ($generated@@109 $generated@@11 $generated@@165) $generated))) + :pattern ( ($generated@@40 $generated@@165 $generated)) ))) -(assert (forall (($generated@@169 T@U) ($generated@@170 T@U) ($generated@@171 T@T) ) (! (= ($generated@@40 ($generated@@113 $generated@@171 $generated@@169) $generated@@170) ($generated@@32 $generated@@171 $generated@@169 $generated@@170)) - :pattern ( ($generated@@40 ($generated@@113 $generated@@171 $generated@@169) $generated@@170)) +(assert (forall (($generated@@166 T@U) ($generated@@167 T@U) ($generated@@168 T@T) ) (! (= ($generated@@40 ($generated@@110 $generated@@168 $generated@@166) $generated@@167) ($generated@@32 $generated@@168 $generated@@166 $generated@@167)) + :pattern ( ($generated@@40 ($generated@@110 $generated@@168 $generated@@166) $generated@@167)) ))) -(assert (forall (($generated@@173 T@U) ($generated@@174 T@U) ) (! (= ($generated@@172 ($generated@@77 $generated@@173 $generated@@174)) $generated@@173) - :pattern ( ($generated@@77 $generated@@173 $generated@@174)) +(assert (forall (($generated@@170 T@U) ($generated@@171 T@U) ) (! (= ($generated@@169 ($generated@@74 $generated@@170 $generated@@171)) $generated@@170) + :pattern ( ($generated@@74 $generated@@170 $generated@@171)) ))) -(assert (forall (($generated@@176 T@U) ($generated@@177 T@U) ) (! (= ($generated@@175 ($generated@@77 $generated@@176 $generated@@177)) $generated@@177) - :pattern ( ($generated@@77 $generated@@176 $generated@@177)) +(assert (forall (($generated@@173 T@U) ($generated@@174 T@U) ) (! (= ($generated@@172 ($generated@@74 $generated@@173 $generated@@174)) $generated@@174) + :pattern ( ($generated@@74 $generated@@173 $generated@@174)) ))) -(assert (forall (($generated@@179 T@U) ($generated@@180 T@U) ) (! (= ($generated@@178 ($generated@@85 $generated@@179 $generated@@180)) $generated@@179) - :pattern ( ($generated@@85 $generated@@179 $generated@@180)) +(assert (forall (($generated@@176 T@U) ($generated@@177 T@U) ) (! (= ($generated@@175 ($generated@@82 $generated@@176 $generated@@177)) $generated@@176) + :pattern ( ($generated@@82 $generated@@176 $generated@@177)) ))) -(assert (forall (($generated@@182 T@U) ($generated@@183 T@U) ) (! (= ($generated@@181 ($generated@@85 $generated@@182 $generated@@183)) $generated@@183) - :pattern ( ($generated@@85 $generated@@182 $generated@@183)) +(assert (forall (($generated@@179 T@U) ($generated@@180 T@U) ) (! (= ($generated@@178 ($generated@@82 $generated@@179 $generated@@180)) $generated@@180) + :pattern ( ($generated@@82 $generated@@179 $generated@@180)) ))) -(assert (forall (($generated@@184 T@U) ($generated@@185 T@U) ) (! (= ($generated@@110 ($generated@@105 $generated@@184 $generated@@185)) $generated@@5) - :pattern ( ($generated@@105 $generated@@184 $generated@@185)) +(assert (forall (($generated@@181 T@U) ($generated@@182 T@U) ) (! (= ($generated@@107 ($generated@@102 $generated@@181 $generated@@182)) $generated@@5) + :pattern ( ($generated@@102 $generated@@181 $generated@@182)) ))) -(assert (forall (($generated@@187 T@U) ($generated@@188 T@U) ) (! (= ($generated@@186 ($generated@@33 $generated@@187 $generated@@188)) $generated@@187) - :pattern ( ($generated@@33 $generated@@187 $generated@@188)) +(assert (forall (($generated@@184 T@U) ($generated@@185 T@U) ) (! (= ($generated@@183 ($generated@@33 $generated@@184 $generated@@185)) $generated@@184) + :pattern ( ($generated@@33 $generated@@184 $generated@@185)) ))) -(assert (forall (($generated@@190 T@U) ($generated@@191 T@U) ) (! (= ($generated@@189 ($generated@@33 $generated@@190 $generated@@191)) $generated@@191) - :pattern ( ($generated@@33 $generated@@190 $generated@@191)) +(assert (forall (($generated@@187 T@U) ($generated@@188 T@U) ) (! (= ($generated@@186 ($generated@@33 $generated@@187 $generated@@188)) $generated@@188) + :pattern ( ($generated@@33 $generated@@187 $generated@@188)) ))) -(assert (forall (($generated@@192 T@U) ($generated@@193 T@U) ) (! (= ($generated@@39 ($generated@@105 $generated@@192 $generated@@193)) $generated@@192) - :pattern ( ($generated@@105 $generated@@192 $generated@@193)) +(assert (forall (($generated@@189 T@U) ($generated@@190 T@U) ) (! (= ($generated@@39 ($generated@@102 $generated@@189 $generated@@190)) $generated@@189) + :pattern ( ($generated@@102 $generated@@189 $generated@@190)) ))) -(assert (forall (($generated@@194 T@U) ($generated@@195 T@U) ) (! (= ($generated@@36 ($generated@@105 $generated@@194 $generated@@195)) $generated@@195) - :pattern ( ($generated@@105 $generated@@194 $generated@@195)) +(assert (forall (($generated@@191 T@U) ($generated@@192 T@U) ) (! (= ($generated@@36 ($generated@@102 $generated@@191 $generated@@192)) $generated@@192) + :pattern ( ($generated@@102 $generated@@191 $generated@@192)) ))) -(assert (forall (($generated@@197 T@U) ) (! (= ($generated@@196 ($generated@@90 $generated@@197)) $generated@@197) - :pattern ( ($generated@@90 $generated@@197)) +(assert (forall (($generated@@194 T@U) ) (! (= ($generated@@193 ($generated@@87 $generated@@194)) $generated@@194) + :pattern ( ($generated@@87 $generated@@194)) ))) -(assert (forall (($generated@@198 T@U) ) (! (= ($generated@@70 ($generated@@90 $generated@@198)) $generated@@1) - :pattern ( ($generated@@90 $generated@@198)) +(assert (forall (($generated@@195 T@U) ) (! (= ($generated@@70 ($generated@@87 $generated@@195)) $generated@@1) + :pattern ( ($generated@@87 $generated@@195)) ))) -(assert (forall (($generated@@199 T@U) ($generated@@200 T@T) ) (! (= ($generated@@112 $generated@@200 ($generated@@113 $generated@@200 $generated@@199)) $generated@@199) - :pattern ( ($generated@@113 $generated@@200 $generated@@199)) +(assert (forall (($generated@@196 T@U) ($generated@@197 T@T) ) (! (= ($generated@@109 $generated@@197 ($generated@@110 $generated@@197 $generated@@196)) $generated@@196) + :pattern ( ($generated@@110 $generated@@197 $generated@@196)) ))) -(assert (forall (($generated@@202 T@U) ($generated@@203 T@U) ($generated@@204 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@202 ($generated@@113 $generated@@29 $generated@@204))) (< ($generated@@201 $generated@@204) ($generated@@201 ($generated@@105 $generated@@202 $generated@@203)))) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@202 ($generated@@113 $generated@@29 $generated@@204)) ($generated@@105 $generated@@202 $generated@@203)) +(assert (forall (($generated@@199 T@U) ($generated@@200 T@U) ($generated@@201 T@U) ) (! (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@199 ($generated@@110 $generated@@29 $generated@@201))) (< ($generated@@198 $generated@@201) ($generated@@198 ($generated@@102 $generated@@199 $generated@@200)))) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@199 ($generated@@110 $generated@@29 $generated@@201)) ($generated@@102 $generated@@199 $generated@@200)) ))) -(assert (forall (($generated@@205 T@U) ($generated@@206 T@U) ($generated@@207 T@U) ) (! (= ($generated@@32 $generated@@43 $generated@@207 ($generated@@85 $generated@@205 $generated@@206)) (and ($generated@@32 $generated@@43 $generated@@207 ($generated@@77 $generated@@205 $generated@@206)) (forall (($generated@@208 T@U) ) (=> ($generated@@40 $generated@@208 $generated@@205) ($generated@@98 ($generated@@96 $generated@@205 $generated@@206 $generated@@97 $generated@@207 $generated@@208) $generated@@99))))) - :pattern ( ($generated@@32 $generated@@43 $generated@@207 ($generated@@85 $generated@@205 $generated@@206))) +(assert (forall (($generated@@202 T@U) ($generated@@203 T@U) ($generated@@204 T@U) ) (! (= ($generated@@32 $generated@@43 $generated@@204 ($generated@@82 $generated@@202 $generated@@203)) (and ($generated@@32 $generated@@43 $generated@@204 ($generated@@74 $generated@@202 $generated@@203)) (forall (($generated@@205 T@U) ) (=> ($generated@@40 $generated@@205 $generated@@202) ($generated@@95 ($generated@@93 $generated@@202 $generated@@203 $generated@@94 $generated@@204 $generated@@205) $generated@@96))))) + :pattern ( ($generated@@32 $generated@@43 $generated@@204 ($generated@@82 $generated@@202 $generated@@203))) ))) -(assert (forall (($generated@@209 T@U) ($generated@@210 T@U) ($generated@@211 T@U) ) (! (=> ($generated@@40 $generated@@211 ($generated@@77 $generated@@209 $generated@@210)) (and (= ($generated@@113 $generated@@43 ($generated@@112 $generated@@43 $generated@@211)) $generated@@211) ($generated@@32 $generated@@43 ($generated@@112 $generated@@43 $generated@@211) ($generated@@77 $generated@@209 $generated@@210)))) - :pattern ( ($generated@@40 $generated@@211 ($generated@@77 $generated@@209 $generated@@210))) +(assert (forall (($generated@@206 T@U) ($generated@@207 T@U) ($generated@@208 T@U) ) (! (=> ($generated@@40 $generated@@208 ($generated@@74 $generated@@206 $generated@@207)) (and (= ($generated@@110 $generated@@43 ($generated@@109 $generated@@43 $generated@@208)) $generated@@208) ($generated@@32 $generated@@43 ($generated@@109 $generated@@43 $generated@@208) ($generated@@74 $generated@@206 $generated@@207)))) + :pattern ( ($generated@@40 $generated@@208 ($generated@@74 $generated@@206 $generated@@207))) ))) -(assert (forall (($generated@@212 T@U) ($generated@@213 T@U) ($generated@@214 T@U) ) (! (=> ($generated@@40 $generated@@214 ($generated@@85 $generated@@212 $generated@@213)) (and (= ($generated@@113 $generated@@43 ($generated@@112 $generated@@43 $generated@@214)) $generated@@214) ($generated@@32 $generated@@43 ($generated@@112 $generated@@43 $generated@@214) ($generated@@85 $generated@@212 $generated@@213)))) - :pattern ( ($generated@@40 $generated@@214 ($generated@@85 $generated@@212 $generated@@213))) +(assert (forall (($generated@@209 T@U) ($generated@@210 T@U) ($generated@@211 T@U) ) (! (=> ($generated@@40 $generated@@211 ($generated@@82 $generated@@209 $generated@@210)) (and (= ($generated@@110 $generated@@43 ($generated@@109 $generated@@43 $generated@@211)) $generated@@211) ($generated@@32 $generated@@43 ($generated@@109 $generated@@43 $generated@@211) ($generated@@82 $generated@@209 $generated@@210)))) + :pattern ( ($generated@@40 $generated@@211 ($generated@@82 $generated@@209 $generated@@210))) ))) -(assert (forall (($generated@@215 T@U) ($generated@@216 T@U) ($generated@@217 T@U) ) (! (=> ($generated@@40 $generated@@217 ($generated@@33 $generated@@215 $generated@@216)) (and (= ($generated@@113 $generated@@29 ($generated@@112 $generated@@29 $generated@@217)) $generated@@217) ($generated@@32 $generated@@29 ($generated@@112 $generated@@29 $generated@@217) ($generated@@33 $generated@@215 $generated@@216)))) - :pattern ( ($generated@@40 $generated@@217 ($generated@@33 $generated@@215 $generated@@216))) +(assert (forall (($generated@@212 T@U) ($generated@@213 T@U) ($generated@@214 T@U) ) (! (=> ($generated@@40 $generated@@214 ($generated@@33 $generated@@212 $generated@@213)) (and (= ($generated@@110 $generated@@29 ($generated@@109 $generated@@29 $generated@@214)) $generated@@214) ($generated@@32 $generated@@29 ($generated@@109 $generated@@29 $generated@@214) ($generated@@33 $generated@@212 $generated@@213)))) + :pattern ( ($generated@@40 $generated@@214 ($generated@@33 $generated@@212 $generated@@213))) ))) -(assert (forall (($generated@@218 T@U) ) (! (not ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@99 $generated@@218))) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@99 $generated@@218)) +(assert (forall (($generated@@215 T@U) ) (! (not ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 $generated@@96 $generated@@215))) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 $generated@@96 $generated@@215)) ))) -(assert (and (forall (($generated@@222 T@T) ($generated@@223 T@T) ($generated@@224 T@T) ($generated@@225 T@U) ($generated@@226 T@U) ($generated@@227 T@U) ($generated@@228 T@U) ) (! (= ($generated@@219 $generated@@222 $generated@@223 $generated@@224 ($generated@@221 $generated@@222 $generated@@223 $generated@@224 $generated@@226 $generated@@227 $generated@@228 $generated@@225) $generated@@227 $generated@@228) $generated@@225) +(assert (and (forall (($generated@@219 T@T) ($generated@@220 T@T) ($generated@@221 T@T) ($generated@@222 T@U) ($generated@@223 T@U) ($generated@@224 T@U) ($generated@@225 T@U) ) (! (= ($generated@@216 $generated@@219 $generated@@220 $generated@@221 ($generated@@218 $generated@@219 $generated@@220 $generated@@221 $generated@@223 $generated@@224 $generated@@225 $generated@@222) $generated@@224 $generated@@225) $generated@@222) :weight 0 -)) (and (forall (($generated@@229 T@T) ($generated@@230 T@T) ($generated@@231 T@T) ($generated@@232 T@U) ($generated@@233 T@U) ($generated@@234 T@U) ($generated@@235 T@U) ($generated@@236 T@U) ($generated@@237 T@U) ) (! (or (= $generated@@234 $generated@@236) (= ($generated@@219 $generated@@229 $generated@@230 $generated@@231 ($generated@@221 $generated@@229 $generated@@230 $generated@@231 $generated@@233 $generated@@234 $generated@@235 $generated@@232) $generated@@236 $generated@@237) ($generated@@219 $generated@@229 $generated@@230 $generated@@231 $generated@@233 $generated@@236 $generated@@237))) +)) (and (forall (($generated@@226 T@T) ($generated@@227 T@T) ($generated@@228 T@T) ($generated@@229 T@U) ($generated@@230 T@U) ($generated@@231 T@U) ($generated@@232 T@U) ($generated@@233 T@U) ($generated@@234 T@U) ) (! (or (= $generated@@231 $generated@@233) (= ($generated@@216 $generated@@226 $generated@@227 $generated@@228 ($generated@@218 $generated@@226 $generated@@227 $generated@@228 $generated@@230 $generated@@231 $generated@@232 $generated@@229) $generated@@233 $generated@@234) ($generated@@216 $generated@@226 $generated@@227 $generated@@228 $generated@@230 $generated@@233 $generated@@234))) :weight 0 -)) (forall (($generated@@238 T@T) ($generated@@239 T@T) ($generated@@240 T@T) ($generated@@241 T@U) ($generated@@242 T@U) ($generated@@243 T@U) ($generated@@244 T@U) ($generated@@245 T@U) ($generated@@246 T@U) ) (! (or (= $generated@@244 $generated@@246) (= ($generated@@219 $generated@@238 $generated@@239 $generated@@240 ($generated@@221 $generated@@238 $generated@@239 $generated@@240 $generated@@242 $generated@@243 $generated@@244 $generated@@241) $generated@@245 $generated@@246) ($generated@@219 $generated@@238 $generated@@239 $generated@@240 $generated@@242 $generated@@245 $generated@@246))) +)) (forall (($generated@@235 T@T) ($generated@@236 T@T) ($generated@@237 T@T) ($generated@@238 T@U) ($generated@@239 T@U) ($generated@@240 T@U) ($generated@@241 T@U) ($generated@@242 T@U) ($generated@@243 T@U) ) (! (or (= $generated@@241 $generated@@243) (= ($generated@@216 $generated@@235 $generated@@236 $generated@@237 ($generated@@218 $generated@@235 $generated@@236 $generated@@237 $generated@@239 $generated@@240 $generated@@241 $generated@@238) $generated@@242 $generated@@243) ($generated@@216 $generated@@235 $generated@@236 $generated@@237 $generated@@239 $generated@@242 $generated@@243))) :weight 0 ))))) -(assert (forall (($generated@@247 T@U) ($generated@@248 T@U) ($generated@@249 T@U) ($generated@@250 Bool) ($generated@@251 T@U) ($generated@@252 T@U) ) (! (= ($generated@@15 ($generated@@219 $generated@@159 $generated@@161 $generated@@11 ($generated@@220 $generated@@247 $generated@@248 $generated@@249 $generated@@250) $generated@@251 $generated@@252)) (=> (and (or (not (= $generated@@251 $generated@@247)) (not true)) ($generated@@15 ($generated@@112 $generated@@11 ($generated@@37 $generated@@161 $generated@@38 ($generated@@37 $generated@@159 ($generated@@42 $generated@@161 $generated@@38) $generated@@248 $generated@@251) $generated@@249)))) $generated@@250)) - :pattern ( ($generated@@219 $generated@@159 $generated@@161 $generated@@11 ($generated@@220 $generated@@247 $generated@@248 $generated@@249 $generated@@250) $generated@@251 $generated@@252)) +(assert (forall (($generated@@244 T@U) ($generated@@245 T@U) ($generated@@246 T@U) ($generated@@247 Bool) ($generated@@248 T@U) ($generated@@249 T@U) ) (! (= ($generated@@15 ($generated@@216 $generated@@156 $generated@@158 $generated@@11 ($generated@@217 $generated@@244 $generated@@245 $generated@@246 $generated@@247) $generated@@248 $generated@@249)) (=> (and (or (not (= $generated@@248 $generated@@244)) (not true)) ($generated@@15 ($generated@@109 $generated@@11 ($generated@@37 $generated@@158 $generated@@38 ($generated@@37 $generated@@156 ($generated@@42 $generated@@158 $generated@@38) $generated@@245 $generated@@248) $generated@@246)))) $generated@@247)) + :pattern ( ($generated@@216 $generated@@156 $generated@@158 $generated@@11 ($generated@@217 $generated@@244 $generated@@245 $generated@@246 $generated@@247) $generated@@248 $generated@@249)) ))) -(assert (forall (($generated@@254 T@U) ($generated@@255 T@U) ) (! (and (= ($generated@@70 ($generated@@77 $generated@@254 $generated@@255)) $generated@@3) (= ($generated@@253 ($generated@@77 $generated@@254 $generated@@255)) $generated@@7)) - :pattern ( ($generated@@77 $generated@@254 $generated@@255)) +(assert (forall (($generated@@251 T@U) ($generated@@252 T@U) ) (! (and (= ($generated@@70 ($generated@@74 $generated@@251 $generated@@252)) $generated@@3) (= ($generated@@250 ($generated@@74 $generated@@251 $generated@@252)) $generated@@7)) + :pattern ( ($generated@@74 $generated@@251 $generated@@252)) ))) -(assert (forall (($generated@@256 T@U) ($generated@@257 T@U) ) (! (and (= ($generated@@70 ($generated@@85 $generated@@256 $generated@@257)) $generated@@4) (= ($generated@@253 ($generated@@85 $generated@@256 $generated@@257)) $generated@@8)) - :pattern ( ($generated@@85 $generated@@256 $generated@@257)) +(assert (forall (($generated@@253 T@U) ($generated@@254 T@U) ) (! (and (= ($generated@@70 ($generated@@82 $generated@@253 $generated@@254)) $generated@@4) (= ($generated@@250 ($generated@@82 $generated@@253 $generated@@254)) $generated@@8)) + :pattern ( ($generated@@82 $generated@@253 $generated@@254)) ))) -(assert (forall (($generated@@258 T@U) ($generated@@259 T@U) ) (! (and (= ($generated@@70 ($generated@@33 $generated@@258 $generated@@259)) $generated@@6) (= ($generated@@253 ($generated@@33 $generated@@258 $generated@@259)) $generated@@9)) - :pattern ( ($generated@@33 $generated@@258 $generated@@259)) +(assert (forall (($generated@@255 T@U) ($generated@@256 T@U) ) (! (and (= ($generated@@70 ($generated@@33 $generated@@255 $generated@@256)) $generated@@6) (= ($generated@@250 ($generated@@33 $generated@@255 $generated@@256)) $generated@@9)) + :pattern ( ($generated@@33 $generated@@255 $generated@@256)) ))) -(assert (forall (($generated@@260 T@U) ($generated@@261 T@U) ($generated@@262 T@U) ($generated@@263 T@U) ($generated@@264 T@U) ) (! (=> (and (and ($generated@@30 $generated@@262) (and ($generated@@40 $generated@@264 $generated@@260) ($generated@@32 $generated@@43 $generated@@263 ($generated@@77 $generated@@260 $generated@@261)))) ($generated@@98 ($generated@@96 $generated@@260 $generated@@261 $generated@@97 $generated@@263 $generated@@264) $generated@@99)) (= ($generated@@35 $generated@@260 $generated@@261 $generated@@97 $generated@@263 $generated@@264) ($generated@@35 $generated@@260 $generated@@261 $generated@@262 $generated@@263 $generated@@264))) - :pattern ( ($generated@@35 $generated@@260 $generated@@261 $generated@@97 $generated@@263 $generated@@264) ($generated@@30 $generated@@262)) - :pattern ( ($generated@@35 $generated@@260 $generated@@261 $generated@@262 $generated@@263 $generated@@264)) +(assert (forall (($generated@@257 T@U) ($generated@@258 T@U) ($generated@@259 T@U) ($generated@@260 T@U) ($generated@@261 T@U) ) (! (=> (and (and ($generated@@30 $generated@@259) (and ($generated@@40 $generated@@261 $generated@@257) ($generated@@32 $generated@@43 $generated@@260 ($generated@@74 $generated@@257 $generated@@258)))) ($generated@@95 ($generated@@93 $generated@@257 $generated@@258 $generated@@94 $generated@@260 $generated@@261) $generated@@96)) (= ($generated@@35 $generated@@257 $generated@@258 $generated@@94 $generated@@260 $generated@@261) ($generated@@35 $generated@@257 $generated@@258 $generated@@259 $generated@@260 $generated@@261))) + :pattern ( ($generated@@35 $generated@@257 $generated@@258 $generated@@94 $generated@@260 $generated@@261) ($generated@@30 $generated@@259)) + :pattern ( ($generated@@35 $generated@@257 $generated@@258 $generated@@259 $generated@@260 $generated@@261)) ))) -(assert (forall (($generated@@265 T@U) ($generated@@266 T@U) ) (! (=> ($generated@@40 $generated@@265 ($generated@@90 $generated@@266)) (and (= ($generated@@113 ($generated@@42 $generated@@38 $generated@@11) ($generated@@112 ($generated@@42 $generated@@38 $generated@@11) $generated@@265)) $generated@@265) ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) ($generated@@112 ($generated@@42 $generated@@38 $generated@@11) $generated@@265) ($generated@@90 $generated@@266)))) - :pattern ( ($generated@@40 $generated@@265 ($generated@@90 $generated@@266))) +(assert (forall (($generated@@262 T@U) ($generated@@263 T@U) ) (! (=> ($generated@@40 $generated@@262 ($generated@@87 $generated@@263)) (and (= ($generated@@110 ($generated@@42 $generated@@38 $generated@@11) ($generated@@109 ($generated@@42 $generated@@38 $generated@@11) $generated@@262)) $generated@@262) ($generated@@32 ($generated@@42 $generated@@38 $generated@@11) ($generated@@109 ($generated@@42 $generated@@38 $generated@@11) $generated@@262) ($generated@@87 $generated@@263)))) + :pattern ( ($generated@@40 $generated@@262 ($generated@@87 $generated@@263))) ))) -(assert (forall (($generated@@267 T@U) ($generated@@268 T@U) ) (! (= ($generated@@105 ($generated@@28 ($generated@@42 $generated@@38 $generated@@11) $generated@@267) ($generated@@28 $generated@@43 $generated@@268)) ($generated@@28 $generated@@29 ($generated@@105 $generated@@267 $generated@@268))) - :pattern ( ($generated@@105 ($generated@@28 ($generated@@42 $generated@@38 $generated@@11) $generated@@267) ($generated@@28 $generated@@43 $generated@@268))) +(assert (forall (($generated@@264 T@U) ($generated@@265 T@U) ) (! (= ($generated@@102 ($generated@@28 ($generated@@42 $generated@@38 $generated@@11) $generated@@264) ($generated@@28 $generated@@43 $generated@@265)) ($generated@@28 $generated@@29 ($generated@@102 $generated@@264 $generated@@265))) + :pattern ( ($generated@@102 ($generated@@28 ($generated@@42 $generated@@38 $generated@@11) $generated@@264) ($generated@@28 $generated@@43 $generated@@265))) ))) -(assert (forall (($generated@@269 T@U) ($generated@@270 T@T) ) (! (= ($generated@@113 $generated@@270 ($generated@@28 $generated@@270 $generated@@269)) ($generated@@28 $generated@@38 ($generated@@113 $generated@@270 $generated@@269))) - :pattern ( ($generated@@113 $generated@@270 ($generated@@28 $generated@@270 $generated@@269))) +(assert (forall (($generated@@266 T@U) ($generated@@267 T@T) ) (! (= ($generated@@110 $generated@@267 ($generated@@28 $generated@@267 $generated@@266)) ($generated@@28 $generated@@38 ($generated@@110 $generated@@267 $generated@@266))) + :pattern ( ($generated@@110 $generated@@267 ($generated@@28 $generated@@267 $generated@@266))) ))) -(assert (forall (($generated@@271 T@U) ($generated@@272 T@U) ($generated@@273 T@U) ) (! (=> (and ($generated@@30 $generated@@273) (and ($generated@@41 $generated@@271) (exists (($generated@@274 T@U) ) (! ($generated@@34 $generated@@29 $generated@@271 ($generated@@33 $generated@@272 $generated@@274) $generated@@273) - :pattern ( ($generated@@34 $generated@@29 $generated@@271 ($generated@@33 $generated@@272 $generated@@274) $generated@@273)) -)))) ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) ($generated@@39 $generated@@271) ($generated@@90 $generated@@272) $generated@@273)) - :pattern ( ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) ($generated@@39 $generated@@271) ($generated@@90 $generated@@272) $generated@@273)) +(assert (forall (($generated@@268 T@U) ($generated@@269 T@U) ($generated@@270 T@U) ) (! (=> (and ($generated@@30 $generated@@270) (and ($generated@@41 $generated@@268) (exists (($generated@@271 T@U) ) (! ($generated@@34 $generated@@29 $generated@@268 ($generated@@33 $generated@@269 $generated@@271) $generated@@270) + :pattern ( ($generated@@34 $generated@@29 $generated@@268 ($generated@@33 $generated@@269 $generated@@271) $generated@@270)) +)))) ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) ($generated@@39 $generated@@268) ($generated@@87 $generated@@269) $generated@@270)) + :pattern ( ($generated@@34 ($generated@@42 $generated@@38 $generated@@11) ($generated@@39 $generated@@268) ($generated@@87 $generated@@269) $generated@@270)) ))) -(assert (forall (($generated@@275 T@U) ($generated@@276 T@U) ) (! ($generated@@34 $generated@@11 $generated@@276 $generated $generated@@275) - :pattern ( ($generated@@34 $generated@@11 $generated@@276 $generated $generated@@275)) +(assert (forall (($generated@@272 T@U) ($generated@@273 T@U) ) (! ($generated@@34 $generated@@11 $generated@@273 $generated $generated@@272) + :pattern ( ($generated@@34 $generated@@11 $generated@@273 $generated $generated@@272)) ))) -(assert (forall (($generated@@277 T@U) ) (! ($generated@@32 $generated@@11 $generated@@277 $generated) - :pattern ( ($generated@@32 $generated@@11 $generated@@277 $generated)) +(assert (forall (($generated@@274 T@U) ) (! ($generated@@32 $generated@@11 $generated@@274 $generated) + :pattern ( ($generated@@32 $generated@@11 $generated@@274 $generated)) ))) (push 1) (declare-fun ControlFlow (Int Int) Int) +(declare-fun $generated@@275 () T@U) +(declare-fun $generated@@276 () T@U) +(declare-fun $generated@@277 () T@U) (declare-fun $generated@@278 () T@U) -(declare-fun $generated@@279 () T@U) +(declare-fun $generated@@279 () Bool) (declare-fun $generated@@280 () T@U) -(declare-fun $generated@@281 () T@U) -(declare-fun $generated@@282 () Bool) -(declare-fun $generated@@283 () T@U) -(declare-fun $generated@@284 () Bool) -(declare-fun $generated@@285 () T@U) -(declare-fun $generated@@286 (T@U) Bool) +(declare-fun $generated@@281 () Bool) +(declare-fun $generated@@282 () T@U) +(declare-fun $generated@@283 (T@U) Bool) (set-option :timeout 0) (set-option :rlimit 0) (set-option :auto_config false) @@ -1391,21 +1388,21 @@ $generated@@442)))))))) (set-option :pp.bv_literals false) (set-option :smt.arith.solver 2) (assert (not - (=> (= (ControlFlow 0 0) 9) (let (($generated@@287 (=> (and (and (= ($generated@@27 $generated@@278 $generated@@279 $generated@@280) (forall (($generated@@288 T@U) ) (! (=> (and ($generated@@40 $generated@@288 $generated@@278) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@288))) ($generated@@35 $generated@@278 $generated@@279 $generated@@281 ($generated@@36 $generated@@280) $generated@@288)) - :pattern ( ($generated@@35 $generated@@278 $generated@@279 $generated@@281 ($generated@@36 $generated@@280) $generated@@288)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@288)) -))) (forall (($generated@@289 T@U) ) (! (=> ($generated@@40 $generated@@289 $generated@@278) (and ($generated@@41 $generated@@280) (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@289)) (and ($generated@@41 $generated@@280) true)))) - :pattern ( ($generated@@35 $generated@@278 $generated@@279 $generated@@281 ($generated@@36 $generated@@280) $generated@@289)) - :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@289)) -))) (and ($generated@@32 $generated@@11 ($generated@@14 ($generated@@27 $generated@@278 $generated@@279 $generated@@280)) $generated) (= (ControlFlow 0 3) (- 0 2)))) $generated@@282))) -(let (($generated@@290 (=> (not ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@283))) (=> (and (= $generated@@282 true) (= (ControlFlow 0 6) 3)) $generated@@287)))) -(let (($generated@@291 (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@280) $generated@@283)) (=> (and ($generated@@41 $generated@@280) ($generated@@124 ($generated@@113 $generated@@43 ($generated@@36 $generated@@280)) ($generated@@77 $generated@@278 $generated@@279) $generated@@281)) (=> (and (and ($generated@@124 $generated@@283 $generated@@278 $generated@@281) (= $generated@@284 (forall (($generated@@292 T@U) ($generated@@293 T@U) ) (=> (and (and (or (not (= $generated@@292 $generated@@160)) (not true)) ($generated@@15 ($generated@@112 $generated@@11 ($generated@@37 $generated@@161 $generated@@38 ($generated@@37 $generated@@159 ($generated@@42 $generated@@161 $generated@@38) $generated@@281 $generated@@292) $generated@@2)))) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@96 $generated@@278 $generated@@279 $generated@@281 ($generated@@36 $generated@@280) $generated@@283) ($generated@@113 $generated@@159 $generated@@292)))) ($generated@@15 ($generated@@219 $generated@@159 $generated@@161 $generated@@11 $generated@@285 $generated@@292 $generated@@293)))))) (and (= $generated@@282 $generated@@284) (= (ControlFlow 0 5) 3))) $generated@@287))))) -(let (($generated@@294 (=> (and (and ($generated@@40 $generated@@283 $generated@@278) ($generated@@124 $generated@@283 $generated@@278 $generated@@281)) ($generated@@41 $generated@@280)) (and (=> (= (ControlFlow 0 7) 5) $generated@@291) (=> (= (ControlFlow 0 7) 6) $generated@@290))))) -(let (($generated@@295 (=> (not (and ($generated@@40 $generated@@283 $generated@@278) ($generated@@124 $generated@@283 $generated@@278 $generated@@281))) (=> (and (= $generated@@282 true) (= (ControlFlow 0 4) 3)) $generated@@287)))) -(let (($generated@@296 true)) -(let (($generated@@297 (=> (= $generated@@285 ($generated@@220 $generated@@160 $generated@@281 $generated@@2 false)) (and (and (=> (= (ControlFlow 0 8) 1) $generated@@296) (=> (= (ControlFlow 0 8) 7) $generated@@294)) (=> (= (ControlFlow 0 8) 4) $generated@@295))))) -(let (($generated@@298 (=> (and ($generated@@30 $generated@@281) ($generated@@286 $generated@@281)) (=> (and (and ($generated@@32 $generated@@29 $generated@@280 ($generated@@33 $generated@@278 $generated@@279)) ($generated@@34 $generated@@29 $generated@@280 ($generated@@33 $generated@@278 $generated@@279) $generated@@281)) (and (= 0 $generated@@26) (= (ControlFlow 0 9) 8))) $generated@@297)))) -$generated@@298))))))))) + (=> (= (ControlFlow 0 0) 9) (let (($generated@@284 (=> (and (and (= ($generated@@27 $generated@@275 $generated@@276 $generated@@277) (forall (($generated@@285 T@U) ) (! (=> (and ($generated@@40 $generated@@285 $generated@@275) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@285))) ($generated@@35 $generated@@275 $generated@@276 $generated@@278 ($generated@@36 $generated@@277) $generated@@285)) + :pattern ( ($generated@@35 $generated@@275 $generated@@276 $generated@@278 ($generated@@36 $generated@@277) $generated@@285)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@285)) +))) (forall (($generated@@286 T@U) ) (! (=> ($generated@@40 $generated@@286 $generated@@275) (and ($generated@@41 $generated@@277) (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@286)) (and ($generated@@41 $generated@@277) true)))) + :pattern ( ($generated@@35 $generated@@275 $generated@@276 $generated@@278 ($generated@@36 $generated@@277) $generated@@286)) + :pattern ( ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@286)) +))) (and ($generated@@32 $generated@@11 ($generated@@14 ($generated@@27 $generated@@275 $generated@@276 $generated@@277)) $generated) (= (ControlFlow 0 3) (- 0 2)))) $generated@@279))) +(let (($generated@@287 (=> (not ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@280))) (=> (and (= $generated@@279 true) (= (ControlFlow 0 6) 3)) $generated@@284)))) +(let (($generated@@288 (=> ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@39 $generated@@277) $generated@@280)) (=> (and ($generated@@41 $generated@@277) ($generated@@121 ($generated@@110 $generated@@43 ($generated@@36 $generated@@277)) ($generated@@74 $generated@@275 $generated@@276) $generated@@278)) (=> (and (and ($generated@@121 $generated@@280 $generated@@275 $generated@@278) (= $generated@@281 (forall (($generated@@289 T@U) ($generated@@290 T@U) ) (=> (and (and (or (not (= $generated@@289 $generated@@157)) (not true)) ($generated@@15 ($generated@@109 $generated@@11 ($generated@@37 $generated@@158 $generated@@38 ($generated@@37 $generated@@156 ($generated@@42 $generated@@158 $generated@@38) $generated@@278 $generated@@289) $generated@@2)))) ($generated@@15 ($generated@@37 $generated@@38 $generated@@11 ($generated@@93 $generated@@275 $generated@@276 $generated@@278 ($generated@@36 $generated@@277) $generated@@280) ($generated@@110 $generated@@156 $generated@@289)))) ($generated@@15 ($generated@@216 $generated@@156 $generated@@158 $generated@@11 $generated@@282 $generated@@289 $generated@@290)))))) (and (= $generated@@279 $generated@@281) (= (ControlFlow 0 5) 3))) $generated@@284))))) +(let (($generated@@291 (=> (and (and ($generated@@40 $generated@@280 $generated@@275) ($generated@@121 $generated@@280 $generated@@275 $generated@@278)) ($generated@@41 $generated@@277)) (and (=> (= (ControlFlow 0 7) 5) $generated@@288) (=> (= (ControlFlow 0 7) 6) $generated@@287))))) +(let (($generated@@292 (=> (not (and ($generated@@40 $generated@@280 $generated@@275) ($generated@@121 $generated@@280 $generated@@275 $generated@@278))) (=> (and (= $generated@@279 true) (= (ControlFlow 0 4) 3)) $generated@@284)))) +(let (($generated@@293 true)) +(let (($generated@@294 (=> (= $generated@@282 ($generated@@217 $generated@@157 $generated@@278 $generated@@2 false)) (and (and (=> (= (ControlFlow 0 8) 1) $generated@@293) (=> (= (ControlFlow 0 8) 7) $generated@@291)) (=> (= (ControlFlow 0 8) 4) $generated@@292))))) +(let (($generated@@295 (=> (and ($generated@@30 $generated@@278) ($generated@@283 $generated@@278)) (=> (and (and ($generated@@32 $generated@@29 $generated@@277 ($generated@@33 $generated@@275 $generated@@276)) ($generated@@34 $generated@@29 $generated@@277 ($generated@@33 $generated@@275 $generated@@276) $generated@@278)) (and (= 0 $generated@@26) (= (ControlFlow 0 9) 8))) $generated@@294)))) +$generated@@295))))))))) )) (check-sat) (get-info :rlimit) @@ -1486,52 +1483,52 @@ $generated@@298))))))))) (declare-fun $generated@@48 (T@T T@T T@U T@U T@U) T@U) (declare-fun $generated@@49 (T@T) T@T) (declare-fun $generated@@50 (T@T) T@T) -(declare-fun $generated@@80 (T@U) T@U) -(declare-fun $generated@@81 () T@U) -(declare-fun $generated@@82 (T@U T@U) T@U) +(declare-fun $generated@@77 (T@U) T@U) +(declare-fun $generated@@78 () T@U) +(declare-fun $generated@@79 (T@U T@U) T@U) +(declare-fun $generated@@87 () T@U) +(declare-fun $generated@@88 () T@T) +(declare-fun $generated@@89 () T@U) (declare-fun $generated@@90 () T@U) -(declare-fun $generated@@91 () T@T) -(declare-fun $generated@@92 () T@U) -(declare-fun $generated@@93 () T@U) -(declare-fun $generated@@94 (T@T T@U) T@U) -(declare-fun $generated@@95 () T@T) -(declare-fun $generated@@98 (T@U T@U) T@U) -(declare-fun $generated@@103 (T@U T@U) Bool) -(declare-fun $generated@@107 (T@U) T@U) -(declare-fun $generated@@111 (T@U) T@U) -(declare-fun $generated@@117 (T@U T@U T@U T@U T@U) T@U) -(declare-fun $generated@@118 () T@U) -(declare-fun $generated@@119 (T@U T@U) Bool) -(declare-fun $generated@@120 () T@U) -(declare-fun $generated@@126 (T@U T@U) T@U) -(declare-fun $generated@@132 (T@T T@U) T@U) -(declare-fun $generated@@138 (T@U) T@U) -(declare-fun $generated@@141 (T@T T@U T@U) T@U) -(declare-fun $generated@@142 () T@T) -(declare-fun $generated@@151 (T@U T@U T@U) Bool) -(declare-fun $generated@@172 (T@U T@U T@U T@U T@U) T@U) -(declare-fun $generated@@173 (T@U T@U T@U) T@U) -(declare-fun $generated@@174 (T@T T@T T@T T@U T@U T@U) T@U) -(declare-fun $generated@@175 (T@T T@T T@T T@U T@U T@U T@U) T@U) -(declare-fun $generated@@215 (Bool) T@U) -(declare-fun $generated@@218 (T@U) T@U) +(declare-fun $generated@@91 (T@T T@U) T@U) +(declare-fun $generated@@92 () T@T) +(declare-fun $generated@@95 (T@U T@U) T@U) +(declare-fun $generated@@100 (T@U T@U) Bool) +(declare-fun $generated@@104 (T@U) T@U) +(declare-fun $generated@@108 (T@U) T@U) +(declare-fun $generated@@114 (T@U T@U T@U T@U T@U) T@U) +(declare-fun $generated@@115 () T@U) +(declare-fun $generated@@116 (T@U T@U) Bool) +(declare-fun $generated@@117 () T@U) +(declare-fun $generated@@123 (T@U T@U) T@U) +(declare-fun $generated@@129 (T@T T@U) T@U) +(declare-fun $generated@@135 (T@U) T@U) +(declare-fun $generated@@138 (T@T T@U T@U) T@U) +(declare-fun $generated@@139 () T@T) +(declare-fun $generated@@148 (T@U T@U T@U) Bool) +(declare-fun $generated@@169 (T@U T@U T@U T@U T@U) T@U) +(declare-fun $generated@@170 (T@U T@U T@U) T@U) +(declare-fun $generated@@171 (T@T T@T T@T T@U T@U T@U) T@U) +(declare-fun $generated@@172 (T@T T@T T@T T@U T@U T@U T@U) T@U) +(declare-fun $generated@@212 (Bool) T@U) +(declare-fun $generated@@215 (T@U) T@U) +(declare-fun $generated@@266 (T@U) T@U) (declare-fun $generated@@269 (T@U) T@U) (declare-fun $generated@@272 (T@U) T@U) (declare-fun $generated@@275 (T@U) T@U) -(declare-fun $generated@@278 (T@U) T@U) +(declare-fun $generated@@280 (T@U) T@U) (declare-fun $generated@@283 (T@U) T@U) -(declare-fun $generated@@286 (T@U) T@U) -(declare-fun $generated@@294 (T@U) T@U) -(declare-fun $generated@@296 (T@U) T@U) -(declare-fun $generated@@298 (T@U) T@U) -(declare-fun $generated@@303 (T@U) Int) -(declare-fun $generated@@311 (T@U) T@U) -(declare-fun $generated@@325 () T@U) -(declare-fun $generated@@327 (T@U T@U T@U Bool) T@U) -(declare-fun $generated@@334 (T@U) T@U) -(declare-fun $generated@@409 (T@U) T@U) -(declare-fun $generated@@413 (T@U) T@U) -(declare-fun $generated@@417 (T@U Bool) T@U) +(declare-fun $generated@@291 (T@U) T@U) +(declare-fun $generated@@293 (T@U) T@U) +(declare-fun $generated@@295 (T@U) T@U) +(declare-fun $generated@@300 (T@U) Int) +(declare-fun $generated@@308 (T@U) T@U) +(declare-fun $generated@@322 () T@U) +(declare-fun $generated@@324 (T@U T@U T@U Bool) T@U) +(declare-fun $generated@@331 (T@U) T@U) +(declare-fun $generated@@406 (T@U) T@U) +(declare-fun $generated@@410 (T@U) T@U) +(declare-fun $generated@@414 (T@U Bool) T@U) (assert (and (and (and (and (and (and (and (and (= ($generated@@14 $generated@@15) 0) (= ($generated@@14 $generated@@16) 1)) (= ($generated@@14 $generated@@17) 2)) (forall (($generated@@24 Bool) ) (! (= ($generated@@19 ($generated@@18 $generated@@24)) $generated@@24) :pattern ( ($generated@@18 $generated@@24)) ))) (forall (($generated@@25 T@U) ) (! (= ($generated@@18 ($generated@@19 $generated@@25)) $generated@@25) @@ -1566,320 +1563,317 @@ $generated@@298))))))))) :weight 3 :pattern ( ($generated@@31 $generated@@68 $generated@@69 ($generated@@32 $generated@@33 $generated@@71)) ($generated@@34 $generated@@70)) )))) -(assert (=> (<= 0 $generated@@30) (forall (($generated@@74 T@U) ($generated@@75 T@U) ($generated@@76 T@U) ) (! (=> (or ($generated@@35 $generated@@74 $generated@@75 $generated@@76) (and (< 0 $generated@@30) ($generated@@36 $generated@@33 $generated@@76 ($generated@@37 $generated@@74 $generated@@75)))) true) - :pattern ( ($generated@@31 $generated@@74 $generated@@75 $generated@@76)) -)))) -(assert (forall (($generated@@77 T@U) ($generated@@78 T@U) ($generated@@79 T@U) ) (! (=> ($generated@@36 $generated@@33 $generated@@79 ($generated@@37 $generated@@77 $generated@@78)) ($generated@@45 $generated@@79)) - :pattern ( ($generated@@45 $generated@@79) ($generated@@36 $generated@@33 $generated@@79 ($generated@@37 $generated@@77 $generated@@78))) +(assert (forall (($generated@@74 T@U) ($generated@@75 T@U) ($generated@@76 T@U) ) (! (=> ($generated@@36 $generated@@33 $generated@@76 ($generated@@37 $generated@@74 $generated@@75)) ($generated@@45 $generated@@76)) + :pattern ( ($generated@@45 $generated@@76) ($generated@@36 $generated@@33 $generated@@76 ($generated@@37 $generated@@74 $generated@@75))) ))) -(assert (= ($generated@@80 $generated@@81) $generated@@5)) -(assert (forall (($generated@@83 T@U) ($generated@@84 T@U) ($generated@@85 T@U) ($generated@@86 T@U) ($generated@@87 T@U) ) (! (=> (and (and ($generated@@36 $generated@@47 $generated@@83 ($generated@@82 $generated@@84 $generated@@85)) (forall (($generated@@88 T@U) ) (! (=> ($generated@@44 $generated@@88 $generated@@86) ($generated@@44 $generated@@88 $generated@@84)) - :pattern ( ($generated@@44 $generated@@88 $generated@@86)) - :pattern ( ($generated@@44 $generated@@88 $generated@@84)) -))) (forall (($generated@@89 T@U) ) (! (=> ($generated@@44 $generated@@89 $generated@@85) ($generated@@44 $generated@@89 $generated@@87)) - :pattern ( ($generated@@44 $generated@@89 $generated@@85)) - :pattern ( ($generated@@44 $generated@@89 $generated@@87)) -))) ($generated@@36 $generated@@47 $generated@@83 ($generated@@82 $generated@@86 $generated@@87))) - :pattern ( ($generated@@36 $generated@@47 $generated@@83 ($generated@@82 $generated@@84 $generated@@85)) ($generated@@36 $generated@@47 $generated@@83 ($generated@@82 $generated@@86 $generated@@87))) +(assert (= ($generated@@77 $generated@@78) $generated@@5)) +(assert (forall (($generated@@80 T@U) ($generated@@81 T@U) ($generated@@82 T@U) ($generated@@83 T@U) ($generated@@84 T@U) ) (! (=> (and (and ($generated@@36 $generated@@47 $generated@@80 ($generated@@79 $generated@@81 $generated@@82)) (forall (($generated@@85 T@U) ) (! (=> ($generated@@44 $generated@@85 $generated@@83) ($generated@@44 $generated@@85 $generated@@81)) + :pattern ( ($generated@@44 $generated@@85 $generated@@83)) + :pattern ( ($generated@@44 $generated@@85 $generated@@81)) +))) (forall (($generated@@86 T@U) ) (! (=> ($generated@@44 $generated@@86 $generated@@82) ($generated@@44 $generated@@86 $generated@@84)) + :pattern ( ($generated@@44 $generated@@86 $generated@@82)) + :pattern ( ($generated@@44 $generated@@86 $generated@@84)) +))) ($generated@@36 $generated@@47 $generated@@80 ($generated@@79 $generated@@83 $generated@@84))) + :pattern ( ($generated@@36 $generated@@47 $generated@@80 ($generated@@79 $generated@@81 $generated@@82)) ($generated@@36 $generated@@47 $generated@@80 ($generated@@79 $generated@@83 $generated@@84))) ))) -(assert ($generated@@36 $generated@@33 $generated@@81 $generated@@90)) -(assert (and (= ($generated@@14 $generated@@91) 7) (= ($generated@@14 $generated@@95) 8))) -(assert (forall (($generated@@96 T@U) ($generated@@97 T@U) ) (! (= ($generated@@38 $generated@@91 $generated@@96 $generated@@92 $generated@@97) (or (= $generated@@96 $generated@@93) ($generated@@19 ($generated@@94 $generated@@15 ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@97 $generated@@96) $generated@@1))))) - :pattern ( ($generated@@38 $generated@@91 $generated@@96 $generated@@92 $generated@@97)) +(assert ($generated@@36 $generated@@33 $generated@@78 $generated@@87)) +(assert (and (= ($generated@@14 $generated@@88) 7) (= ($generated@@14 $generated@@92) 8))) +(assert (forall (($generated@@93 T@U) ($generated@@94 T@U) ) (! (= ($generated@@38 $generated@@88 $generated@@93 $generated@@89 $generated@@94) (or (= $generated@@93 $generated@@90) ($generated@@19 ($generated@@91 $generated@@15 ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@94 $generated@@93) $generated@@1))))) + :pattern ( ($generated@@38 $generated@@88 $generated@@93 $generated@@89 $generated@@94)) ))) -(assert (forall (($generated@@99 T@U) ($generated@@100 T@U) ($generated@@101 T@U) ($generated@@102 T@U) ) (! (=> (and ($generated@@34 $generated@@102) (and ($generated@@45 $generated@@99) ($generated@@38 $generated@@33 $generated@@99 ($generated@@37 $generated@@100 $generated@@101) $generated@@102))) ($generated@@38 $generated@@47 ($generated@@40 $generated@@99) ($generated@@98 $generated@@100 $generated@@101) $generated@@102)) - :pattern ( ($generated@@38 $generated@@47 ($generated@@40 $generated@@99) ($generated@@98 $generated@@100 $generated@@101) $generated@@102)) +(assert (forall (($generated@@96 T@U) ($generated@@97 T@U) ($generated@@98 T@U) ($generated@@99 T@U) ) (! (=> (and ($generated@@34 $generated@@99) (and ($generated@@45 $generated@@96) ($generated@@38 $generated@@33 $generated@@96 ($generated@@37 $generated@@97 $generated@@98) $generated@@99))) ($generated@@38 $generated@@47 ($generated@@40 $generated@@96) ($generated@@95 $generated@@97 $generated@@98) $generated@@99)) + :pattern ( ($generated@@38 $generated@@47 ($generated@@40 $generated@@96) ($generated@@95 $generated@@97 $generated@@98) $generated@@99)) ))) -(assert (forall (($generated@@104 T@U) ($generated@@105 T@U) ) (! (=> ($generated@@103 $generated@@104 $generated@@105) (forall (($generated@@106 T@U) ) (! (=> ($generated@@19 ($generated@@94 $generated@@15 ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@104 $generated@@106) $generated@@1))) ($generated@@19 ($generated@@94 $generated@@15 ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@105 $generated@@106) $generated@@1)))) - :pattern ( ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@105 $generated@@106) $generated@@1)) +(assert (forall (($generated@@101 T@U) ($generated@@102 T@U) ) (! (=> ($generated@@100 $generated@@101 $generated@@102) (forall (($generated@@103 T@U) ) (! (=> ($generated@@19 ($generated@@91 $generated@@15 ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@101 $generated@@103) $generated@@1))) ($generated@@19 ($generated@@91 $generated@@15 ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@102 $generated@@103) $generated@@1)))) + :pattern ( ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@102 $generated@@103) $generated@@1)) ))) - :pattern ( ($generated@@103 $generated@@104 $generated@@105)) + :pattern ( ($generated@@100 $generated@@101 $generated@@102)) ))) -(assert (forall (($generated@@108 T@U) ($generated@@109 T@U) ) (! (= ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@108 ($generated@@107 $generated@@109)) (forall (($generated@@110 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@108 $generated@@110)) ($generated@@44 $generated@@110 $generated@@109)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@108 $generated@@110)) +(assert (forall (($generated@@105 T@U) ($generated@@106 T@U) ) (! (= ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@105 ($generated@@104 $generated@@106)) (forall (($generated@@107 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@105 $generated@@107)) ($generated@@44 $generated@@107 $generated@@106)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@105 $generated@@107)) ))) - :pattern ( ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@108 ($generated@@107 $generated@@109))) + :pattern ( ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@105 ($generated@@104 $generated@@106))) ))) -(assert (forall (($generated@@112 T@U) ($generated@@113 T@U) ) (! (= ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@112 ($generated@@111 $generated@@113)) (forall (($generated@@114 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@112 $generated@@114)) ($generated@@44 $generated@@114 $generated@@113)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@112 $generated@@114)) +(assert (forall (($generated@@109 T@U) ($generated@@110 T@U) ) (! (= ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@109 ($generated@@108 $generated@@110)) (forall (($generated@@111 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@109 $generated@@111)) ($generated@@44 $generated@@111 $generated@@110)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@109 $generated@@111)) ))) - :pattern ( ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@112 ($generated@@111 $generated@@113))) + :pattern ( ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@109 ($generated@@108 $generated@@110))) ))) -(assert (forall (($generated@@115 T@U) ($generated@@116 T@T) ) (! (= ($generated@@32 $generated@@116 $generated@@115) $generated@@115) - :pattern ( ($generated@@32 $generated@@116 $generated@@115)) +(assert (forall (($generated@@112 T@U) ($generated@@113 T@T) ) (! (= ($generated@@32 $generated@@113 $generated@@112) $generated@@112) + :pattern ( ($generated@@32 $generated@@113 $generated@@112)) ))) -(assert (forall (($generated@@121 T@U) ($generated@@122 T@U) ($generated@@123 T@U) ($generated@@124 T@U) ($generated@@125 T@U) ) (! (=> (and ($generated@@34 $generated@@123) (and ($generated@@44 $generated@@125 $generated@@121) ($generated@@36 $generated@@47 $generated@@124 ($generated@@82 $generated@@121 $generated@@122)))) (= ($generated@@119 ($generated@@117 $generated@@121 $generated@@122 $generated@@118 $generated@@124 $generated@@125) $generated@@120) ($generated@@119 ($generated@@117 $generated@@121 $generated@@122 $generated@@123 $generated@@124 $generated@@125) $generated@@120))) - :pattern ( ($generated@@117 $generated@@121 $generated@@122 $generated@@118 $generated@@124 $generated@@125) ($generated@@34 $generated@@123)) - :pattern ( ($generated@@117 $generated@@121 $generated@@122 $generated@@123 $generated@@124 $generated@@125)) +(assert (forall (($generated@@118 T@U) ($generated@@119 T@U) ($generated@@120 T@U) ($generated@@121 T@U) ($generated@@122 T@U) ) (! (=> (and ($generated@@34 $generated@@120) (and ($generated@@44 $generated@@122 $generated@@118) ($generated@@36 $generated@@47 $generated@@121 ($generated@@79 $generated@@118 $generated@@119)))) (= ($generated@@116 ($generated@@114 $generated@@118 $generated@@119 $generated@@115 $generated@@121 $generated@@122) $generated@@117) ($generated@@116 ($generated@@114 $generated@@118 $generated@@119 $generated@@120 $generated@@121 $generated@@122) $generated@@117))) + :pattern ( ($generated@@114 $generated@@118 $generated@@119 $generated@@115 $generated@@121 $generated@@122) ($generated@@34 $generated@@120)) + :pattern ( ($generated@@114 $generated@@118 $generated@@119 $generated@@120 $generated@@121 $generated@@122)) ))) -(assert (forall (($generated@@127 T@U) ($generated@@128 T@U) ($generated@@129 T@U) ($generated@@130 T@U) ) (! (= ($generated@@36 $generated@@33 ($generated@@126 $generated@@129 $generated@@130) ($generated@@37 $generated@@127 $generated@@128)) (and ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@129 ($generated@@111 $generated@@127)) ($generated@@36 $generated@@47 $generated@@130 ($generated@@98 $generated@@127 $generated@@128)))) - :pattern ( ($generated@@36 $generated@@33 ($generated@@126 $generated@@129 $generated@@130) ($generated@@37 $generated@@127 $generated@@128))) +(assert (forall (($generated@@124 T@U) ($generated@@125 T@U) ($generated@@126 T@U) ($generated@@127 T@U) ) (! (= ($generated@@36 $generated@@33 ($generated@@123 $generated@@126 $generated@@127) ($generated@@37 $generated@@124 $generated@@125)) (and ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) $generated@@126 ($generated@@108 $generated@@124)) ($generated@@36 $generated@@47 $generated@@127 ($generated@@95 $generated@@124 $generated@@125)))) + :pattern ( ($generated@@36 $generated@@33 ($generated@@123 $generated@@126 $generated@@127) ($generated@@37 $generated@@124 $generated@@125))) ))) -(assert (forall (($generated@@131 T@U) ) (! (= ($generated@@45 $generated@@131) (= ($generated@@80 $generated@@131) $generated@@7)) - :pattern ( ($generated@@45 $generated@@131)) +(assert (forall (($generated@@128 T@U) ) (! (= ($generated@@45 $generated@@128) (= ($generated@@77 $generated@@128) $generated@@7)) + :pattern ( ($generated@@45 $generated@@128)) ))) -(assert (forall (($generated@@133 T@U) ($generated@@134 T@T) ) (! (= ($generated@@132 $generated@@134 ($generated@@94 $generated@@134 $generated@@133)) $generated@@133) - :pattern ( ($generated@@94 $generated@@134 $generated@@133)) +(assert (forall (($generated@@130 T@U) ($generated@@131 T@T) ) (! (= ($generated@@129 $generated@@131 ($generated@@91 $generated@@131 $generated@@130)) $generated@@130) + :pattern ( ($generated@@91 $generated@@131 $generated@@130)) ))) -(assert (forall (($generated@@135 T@U) ) (! (=> ($generated@@45 $generated@@135) (exists (($generated@@136 T@U) ($generated@@137 T@U) ) (= $generated@@135 ($generated@@126 $generated@@136 $generated@@137)))) - :pattern ( ($generated@@45 $generated@@135)) +(assert (forall (($generated@@132 T@U) ) (! (=> ($generated@@45 $generated@@132) (exists (($generated@@133 T@U) ($generated@@134 T@U) ) (= $generated@@132 ($generated@@123 $generated@@133 $generated@@134)))) + :pattern ( ($generated@@45 $generated@@132)) ))) -(assert (forall (($generated@@139 T@U) ($generated@@140 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@138 $generated@@139) $generated@@140)) ($generated@@19 ($generated@@41 $generated@@91 $generated@@15 $generated@@139 ($generated@@94 $generated@@91 $generated@@140)))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@138 $generated@@139) $generated@@140)) +(assert (forall (($generated@@136 T@U) ($generated@@137 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@135 $generated@@136) $generated@@137)) ($generated@@19 ($generated@@41 $generated@@88 $generated@@15 $generated@@136 ($generated@@91 $generated@@88 $generated@@137)))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@135 $generated@@136) $generated@@137)) ))) -(assert (= ($generated@@14 $generated@@142) 9)) -(assert (forall (($generated@@143 T@U) ($generated@@144 T@U) ($generated@@145 T@T) ) (! (= ($generated@@141 $generated@@145 $generated@@143 $generated@@144) ($generated@@41 $generated@@142 $generated@@145 $generated@@143 $generated@@144)) - :pattern ( ($generated@@141 $generated@@145 $generated@@143 $generated@@144)) +(assert (= ($generated@@14 $generated@@139) 9)) +(assert (forall (($generated@@140 T@U) ($generated@@141 T@U) ($generated@@142 T@T) ) (! (= ($generated@@138 $generated@@142 $generated@@140 $generated@@141) ($generated@@41 $generated@@139 $generated@@142 $generated@@140 $generated@@141)) + :pattern ( ($generated@@138 $generated@@142 $generated@@140 $generated@@141)) ))) -(assert (forall (($generated@@146 T@U) ($generated@@147 T@U) ($generated@@148 T@U) ($generated@@149 T@U) ($generated@@150 T@U) ) (! (=> ($generated@@34 $generated@@150) (= ($generated@@38 $generated@@33 ($generated@@126 $generated@@148 $generated@@149) ($generated@@37 $generated@@146 $generated@@147) $generated@@150) (and ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@148 ($generated@@111 $generated@@146) $generated@@150) ($generated@@38 $generated@@47 $generated@@149 ($generated@@98 $generated@@146 $generated@@147) $generated@@150)))) - :pattern ( ($generated@@38 $generated@@33 ($generated@@126 $generated@@148 $generated@@149) ($generated@@37 $generated@@146 $generated@@147) $generated@@150)) +(assert (forall (($generated@@143 T@U) ($generated@@144 T@U) ($generated@@145 T@U) ($generated@@146 T@U) ($generated@@147 T@U) ) (! (=> ($generated@@34 $generated@@147) (= ($generated@@38 $generated@@33 ($generated@@123 $generated@@145 $generated@@146) ($generated@@37 $generated@@143 $generated@@144) $generated@@147) (and ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@145 ($generated@@108 $generated@@143) $generated@@147) ($generated@@38 $generated@@47 $generated@@146 ($generated@@95 $generated@@143 $generated@@144) $generated@@147)))) + :pattern ( ($generated@@38 $generated@@33 ($generated@@123 $generated@@145 $generated@@146) ($generated@@37 $generated@@143 $generated@@144) $generated@@147)) ))) -(assert ($generated@@34 $generated@@118)) -(assert (forall (($generated@@152 T@U) ($generated@@153 T@U) ($generated@@154 T@U) ($generated@@155 T@T) ) (! (= ($generated@@151 ($generated@@132 $generated@@155 $generated@@152) $generated@@153 $generated@@154) ($generated@@38 $generated@@155 $generated@@152 $generated@@153 $generated@@154)) - :pattern ( ($generated@@151 ($generated@@132 $generated@@155 $generated@@152) $generated@@153 $generated@@154)) +(assert ($generated@@34 $generated@@115)) +(assert (forall (($generated@@149 T@U) ($generated@@150 T@U) ($generated@@151 T@U) ($generated@@152 T@T) ) (! (= ($generated@@148 ($generated@@129 $generated@@152 $generated@@149) $generated@@150 $generated@@151) ($generated@@38 $generated@@152 $generated@@149 $generated@@150 $generated@@151)) + :pattern ( ($generated@@148 ($generated@@129 $generated@@152 $generated@@149) $generated@@150 $generated@@151)) ))) -(assert (forall (($generated@@156 T@U) ($generated@@157 T@U) ($generated@@158 T@U) ($generated@@159 T@U) ) (! (=> ($generated@@103 $generated@@156 $generated@@157) (=> ($generated@@151 $generated@@158 $generated@@159 $generated@@156) ($generated@@151 $generated@@158 $generated@@159 $generated@@157))) - :pattern ( ($generated@@103 $generated@@156 $generated@@157) ($generated@@151 $generated@@158 $generated@@159 $generated@@156)) +(assert (forall (($generated@@153 T@U) ($generated@@154 T@U) ($generated@@155 T@U) ($generated@@156 T@U) ) (! (=> ($generated@@100 $generated@@153 $generated@@154) (=> ($generated@@148 $generated@@155 $generated@@156 $generated@@153) ($generated@@148 $generated@@155 $generated@@156 $generated@@154))) + :pattern ( ($generated@@100 $generated@@153 $generated@@154) ($generated@@148 $generated@@155 $generated@@156 $generated@@153)) ))) -(assert (forall (($generated@@160 T@U) ($generated@@161 T@U) ($generated@@162 T@U) ($generated@@163 T@U) ($generated@@164 T@T) ) (! (=> ($generated@@103 $generated@@160 $generated@@161) (=> ($generated@@38 $generated@@164 $generated@@162 $generated@@163 $generated@@160) ($generated@@38 $generated@@164 $generated@@162 $generated@@163 $generated@@161))) - :pattern ( ($generated@@103 $generated@@160 $generated@@161) ($generated@@38 $generated@@164 $generated@@162 $generated@@163 $generated@@160)) +(assert (forall (($generated@@157 T@U) ($generated@@158 T@U) ($generated@@159 T@U) ($generated@@160 T@U) ($generated@@161 T@T) ) (! (=> ($generated@@100 $generated@@157 $generated@@158) (=> ($generated@@38 $generated@@161 $generated@@159 $generated@@160 $generated@@157) ($generated@@38 $generated@@161 $generated@@159 $generated@@160 $generated@@158))) + :pattern ( ($generated@@100 $generated@@157 $generated@@158) ($generated@@38 $generated@@161 $generated@@159 $generated@@160 $generated@@157)) ))) -(assert (forall (($generated@@165 T@U) ($generated@@166 T@U) ) (! (= ($generated@@119 $generated@@165 $generated@@166) (forall (($generated@@167 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@165 $generated@@167)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@166 $generated@@167))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@165 $generated@@167)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@166 $generated@@167)) +(assert (forall (($generated@@162 T@U) ($generated@@163 T@U) ) (! (= ($generated@@116 $generated@@162 $generated@@163) (forall (($generated@@164 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@162 $generated@@164)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@163 $generated@@164))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@162 $generated@@164)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@163 $generated@@164)) ))) - :pattern ( ($generated@@119 $generated@@165 $generated@@166)) + :pattern ( ($generated@@116 $generated@@162 $generated@@163)) ))) -(assert (forall (($generated@@168 T@U) ($generated@@169 T@U) ($generated@@170 T@U) ($generated@@171 T@U) ) (! (= ($generated@@38 $generated@@47 $generated@@170 ($generated@@98 $generated@@168 $generated@@169) $generated@@171) ($generated@@38 $generated@@47 $generated@@170 ($generated@@82 $generated@@168 $generated@@169) $generated@@171)) - :pattern ( ($generated@@38 $generated@@47 $generated@@170 ($generated@@98 $generated@@168 $generated@@169) $generated@@171)) +(assert (forall (($generated@@165 T@U) ($generated@@166 T@U) ($generated@@167 T@U) ($generated@@168 T@U) ) (! (= ($generated@@38 $generated@@47 $generated@@167 ($generated@@95 $generated@@165 $generated@@166) $generated@@168) ($generated@@38 $generated@@47 $generated@@167 ($generated@@79 $generated@@165 $generated@@166) $generated@@168)) + :pattern ( ($generated@@38 $generated@@47 $generated@@167 ($generated@@95 $generated@@165 $generated@@166) $generated@@168)) ))) -(assert (and (forall (($generated@@176 T@T) ($generated@@177 T@T) ($generated@@178 T@T) ($generated@@179 T@U) ($generated@@180 T@U) ($generated@@181 T@U) ($generated@@182 T@U) ) (! (= ($generated@@174 $generated@@176 $generated@@177 $generated@@178 ($generated@@175 $generated@@176 $generated@@177 $generated@@178 $generated@@180 $generated@@181 $generated@@182 $generated@@179) $generated@@181 $generated@@182) $generated@@179) +(assert (and (forall (($generated@@173 T@T) ($generated@@174 T@T) ($generated@@175 T@T) ($generated@@176 T@U) ($generated@@177 T@U) ($generated@@178 T@U) ($generated@@179 T@U) ) (! (= ($generated@@171 $generated@@173 $generated@@174 $generated@@175 ($generated@@172 $generated@@173 $generated@@174 $generated@@175 $generated@@177 $generated@@178 $generated@@179 $generated@@176) $generated@@178 $generated@@179) $generated@@176) :weight 0 -)) (and (forall (($generated@@183 T@T) ($generated@@184 T@T) ($generated@@185 T@T) ($generated@@186 T@U) ($generated@@187 T@U) ($generated@@188 T@U) ($generated@@189 T@U) ($generated@@190 T@U) ($generated@@191 T@U) ) (! (or (= $generated@@188 $generated@@190) (= ($generated@@174 $generated@@183 $generated@@184 $generated@@185 ($generated@@175 $generated@@183 $generated@@184 $generated@@185 $generated@@187 $generated@@188 $generated@@189 $generated@@186) $generated@@190 $generated@@191) ($generated@@174 $generated@@183 $generated@@184 $generated@@185 $generated@@187 $generated@@190 $generated@@191))) +)) (and (forall (($generated@@180 T@T) ($generated@@181 T@T) ($generated@@182 T@T) ($generated@@183 T@U) ($generated@@184 T@U) ($generated@@185 T@U) ($generated@@186 T@U) ($generated@@187 T@U) ($generated@@188 T@U) ) (! (or (= $generated@@185 $generated@@187) (= ($generated@@171 $generated@@180 $generated@@181 $generated@@182 ($generated@@172 $generated@@180 $generated@@181 $generated@@182 $generated@@184 $generated@@185 $generated@@186 $generated@@183) $generated@@187 $generated@@188) ($generated@@171 $generated@@180 $generated@@181 $generated@@182 $generated@@184 $generated@@187 $generated@@188))) :weight 0 -)) (forall (($generated@@192 T@T) ($generated@@193 T@T) ($generated@@194 T@T) ($generated@@195 T@U) ($generated@@196 T@U) ($generated@@197 T@U) ($generated@@198 T@U) ($generated@@199 T@U) ($generated@@200 T@U) ) (! (or (= $generated@@198 $generated@@200) (= ($generated@@174 $generated@@192 $generated@@193 $generated@@194 ($generated@@175 $generated@@192 $generated@@193 $generated@@194 $generated@@196 $generated@@197 $generated@@198 $generated@@195) $generated@@199 $generated@@200) ($generated@@174 $generated@@192 $generated@@193 $generated@@194 $generated@@196 $generated@@199 $generated@@200))) +)) (forall (($generated@@189 T@T) ($generated@@190 T@T) ($generated@@191 T@T) ($generated@@192 T@U) ($generated@@193 T@U) ($generated@@194 T@U) ($generated@@195 T@U) ($generated@@196 T@U) ($generated@@197 T@U) ) (! (or (= $generated@@195 $generated@@197) (= ($generated@@171 $generated@@189 $generated@@190 $generated@@191 ($generated@@172 $generated@@189 $generated@@190 $generated@@191 $generated@@193 $generated@@194 $generated@@195 $generated@@192) $generated@@196 $generated@@197) ($generated@@171 $generated@@189 $generated@@190 $generated@@191 $generated@@193 $generated@@196 $generated@@197))) :weight 0 ))))) -(assert (forall (($generated@@201 T@U) ($generated@@202 T@U) ($generated@@203 T@U) ($generated@@204 T@U) ($generated@@205 T@U) ($generated@@206 T@U) ($generated@@207 T@U) ) (! (= ($generated@@172 $generated@@201 $generated@@202 $generated@@203 ($generated@@173 $generated@@204 $generated@@205 $generated@@206) $generated@@207) ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@42 $generated@@204 $generated@@203 $generated@@207)) - :pattern ( ($generated@@172 $generated@@201 $generated@@202 $generated@@203 ($generated@@173 $generated@@204 $generated@@205 $generated@@206) $generated@@207)) +(assert (forall (($generated@@198 T@U) ($generated@@199 T@U) ($generated@@200 T@U) ($generated@@201 T@U) ($generated@@202 T@U) ($generated@@203 T@U) ($generated@@204 T@U) ) (! (= ($generated@@169 $generated@@198 $generated@@199 $generated@@200 ($generated@@170 $generated@@201 $generated@@202 $generated@@203) $generated@@204) ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@42 $generated@@201 $generated@@200 $generated@@204)) + :pattern ( ($generated@@169 $generated@@198 $generated@@199 $generated@@200 ($generated@@170 $generated@@201 $generated@@202 $generated@@203) $generated@@204)) ))) -(assert (forall (($generated@@208 T@U) ) (! (=> ($generated@@44 $generated@@208 $generated@@92) (and (= ($generated@@132 $generated@@91 ($generated@@94 $generated@@91 $generated@@208)) $generated@@208) ($generated@@36 $generated@@91 ($generated@@94 $generated@@91 $generated@@208) $generated@@92))) - :pattern ( ($generated@@44 $generated@@208 $generated@@92)) +(assert (forall (($generated@@205 T@U) ) (! (=> ($generated@@44 $generated@@205 $generated@@89) (and (= ($generated@@129 $generated@@88 ($generated@@91 $generated@@88 $generated@@205)) $generated@@205) ($generated@@36 $generated@@88 ($generated@@91 $generated@@88 $generated@@205) $generated@@89))) + :pattern ( ($generated@@44 $generated@@205 $generated@@89)) ))) -(assert (forall (($generated@@209 T@U) ) (! (=> ($generated@@44 $generated@@209 $generated@@90) (and (= ($generated@@132 $generated@@33 ($generated@@94 $generated@@33 $generated@@209)) $generated@@209) ($generated@@36 $generated@@33 ($generated@@94 $generated@@33 $generated@@209) $generated@@90))) - :pattern ( ($generated@@44 $generated@@209 $generated@@90)) +(assert (forall (($generated@@206 T@U) ) (! (=> ($generated@@44 $generated@@206 $generated@@87) (and (= ($generated@@129 $generated@@33 ($generated@@91 $generated@@33 $generated@@206)) $generated@@206) ($generated@@36 $generated@@33 ($generated@@91 $generated@@33 $generated@@206) $generated@@87))) + :pattern ( ($generated@@44 $generated@@206 $generated@@87)) ))) -(assert (forall (($generated@@210 T@U) ($generated@@211 T@U) ($generated@@212 T@U) ($generated@@213 T@U) ) (! (=> (and ($generated@@34 $generated@@213) ($generated@@38 $generated@@47 $generated@@210 ($generated@@82 $generated@@211 $generated@@212) $generated@@213)) (forall (($generated@@214 T@U) ) (! (=> (and ($generated@@151 $generated@@214 $generated@@211 $generated@@213) ($generated@@39 $generated@@211 $generated@@212 $generated@@213 $generated@@210 $generated@@214)) ($generated@@151 ($generated@@172 $generated@@211 $generated@@212 $generated@@213 $generated@@210 $generated@@214) $generated@@212 $generated@@213)) - :pattern ( ($generated@@172 $generated@@211 $generated@@212 $generated@@213 $generated@@210 $generated@@214)) +(assert (forall (($generated@@207 T@U) ($generated@@208 T@U) ($generated@@209 T@U) ($generated@@210 T@U) ) (! (=> (and ($generated@@34 $generated@@210) ($generated@@38 $generated@@47 $generated@@207 ($generated@@79 $generated@@208 $generated@@209) $generated@@210)) (forall (($generated@@211 T@U) ) (! (=> (and ($generated@@148 $generated@@211 $generated@@208 $generated@@210) ($generated@@39 $generated@@208 $generated@@209 $generated@@210 $generated@@207 $generated@@211)) ($generated@@148 ($generated@@169 $generated@@208 $generated@@209 $generated@@210 $generated@@207 $generated@@211) $generated@@209 $generated@@210)) + :pattern ( ($generated@@169 $generated@@208 $generated@@209 $generated@@210 $generated@@207 $generated@@211)) ))) - :pattern ( ($generated@@38 $generated@@47 $generated@@210 ($generated@@82 $generated@@211 $generated@@212) $generated@@213)) + :pattern ( ($generated@@38 $generated@@47 $generated@@207 ($generated@@79 $generated@@208 $generated@@209) $generated@@210)) ))) -(assert (forall (($generated@@216 Bool) ($generated@@217 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@91 $generated@@15 ($generated@@215 $generated@@216) $generated@@217)) $generated@@216) - :pattern ( ($generated@@41 $generated@@91 $generated@@15 ($generated@@215 $generated@@216) $generated@@217)) +(assert (forall (($generated@@213 Bool) ($generated@@214 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@88 $generated@@15 ($generated@@212 $generated@@213) $generated@@214)) $generated@@213) + :pattern ( ($generated@@41 $generated@@88 $generated@@15 ($generated@@212 $generated@@213) $generated@@214)) ))) -(assert (forall (($generated@@219 T@U) ($generated@@220 T@U) ) (! (= ($generated@@41 $generated@@142 $generated@@47 ($generated@@218 $generated@@219) $generated@@220) $generated@@219) - :pattern ( ($generated@@41 $generated@@142 $generated@@47 ($generated@@218 $generated@@219) $generated@@220)) +(assert (forall (($generated@@216 T@U) ($generated@@217 T@U) ) (! (= ($generated@@41 $generated@@139 $generated@@47 ($generated@@215 $generated@@216) $generated@@217) $generated@@216) + :pattern ( ($generated@@41 $generated@@139 $generated@@47 ($generated@@215 $generated@@216) $generated@@217)) ))) -(assert (forall (($generated@@221 T@U) ($generated@@222 T@U) ($generated@@223 T@U) ) (! (= ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@221 ($generated@@107 $generated@@222) $generated@@223) (forall (($generated@@224 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@221 $generated@@224)) ($generated@@151 $generated@@224 $generated@@222 $generated@@223)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@221 $generated@@224)) +(assert (forall (($generated@@218 T@U) ($generated@@219 T@U) ($generated@@220 T@U) ) (! (= ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@218 ($generated@@104 $generated@@219) $generated@@220) (forall (($generated@@221 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@218 $generated@@221)) ($generated@@148 $generated@@221 $generated@@219 $generated@@220)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@218 $generated@@221)) ))) - :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@221 ($generated@@107 $generated@@222) $generated@@223)) + :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@218 ($generated@@104 $generated@@219) $generated@@220)) ))) -(assert (forall (($generated@@225 T@U) ($generated@@226 T@U) ($generated@@227 T@U) ) (! (= ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@225 ($generated@@111 $generated@@226) $generated@@227) (forall (($generated@@228 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@225 $generated@@228)) ($generated@@151 $generated@@228 $generated@@226 $generated@@227)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@225 $generated@@228)) +(assert (forall (($generated@@222 T@U) ($generated@@223 T@U) ($generated@@224 T@U) ) (! (= ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@222 ($generated@@108 $generated@@223) $generated@@224) (forall (($generated@@225 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@222 $generated@@225)) ($generated@@148 $generated@@225 $generated@@223 $generated@@224)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@222 $generated@@225)) ))) - :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@225 ($generated@@111 $generated@@226) $generated@@227)) + :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) $generated@@222 ($generated@@108 $generated@@223) $generated@@224)) ))) -(assert (forall (($generated@@229 T@U) ($generated@@230 T@U) ($generated@@231 T@U) ($generated@@232 T@U) ($generated@@233 T@U) ($generated@@234 T@U) ($generated@@235 T@U) ($generated@@236 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@229 $generated@@230 $generated@@231 ($generated@@173 $generated@@232 $generated@@233 $generated@@234) $generated@@235) $generated@@236)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) $generated@@234 $generated@@231 $generated@@235) $generated@@236))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@229 $generated@@230 $generated@@231 ($generated@@173 $generated@@232 $generated@@233 $generated@@234) $generated@@235) $generated@@236)) +(assert (forall (($generated@@226 T@U) ($generated@@227 T@U) ($generated@@228 T@U) ($generated@@229 T@U) ($generated@@230 T@U) ($generated@@231 T@U) ($generated@@232 T@U) ($generated@@233 T@U) ) (! (= ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@226 $generated@@227 $generated@@228 ($generated@@170 $generated@@229 $generated@@230 $generated@@231) $generated@@232) $generated@@233)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) $generated@@231 $generated@@228 $generated@@232) $generated@@233))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@226 $generated@@227 $generated@@228 ($generated@@170 $generated@@229 $generated@@230 $generated@@231) $generated@@232) $generated@@233)) ))) -(assert (forall (($generated@@237 T@U) ($generated@@238 T@U) ) (! (=> ($generated@@119 $generated@@237 $generated@@238) (= $generated@@237 $generated@@238)) - :pattern ( ($generated@@119 $generated@@237 $generated@@238)) +(assert (forall (($generated@@234 T@U) ($generated@@235 T@U) ) (! (=> ($generated@@116 $generated@@234 $generated@@235) (= $generated@@234 $generated@@235)) + :pattern ( ($generated@@116 $generated@@234 $generated@@235)) ))) -(assert (=> (<= 0 $generated@@30) (forall (($generated@@239 T@U) ($generated@@240 T@U) ($generated@@241 T@U) ($generated@@242 T@U) ) (! (=> (or ($generated@@35 $generated@@239 $generated@@240 $generated@@242) (and (< 0 $generated@@30) (and ($generated@@34 $generated@@241) (and ($generated@@36 $generated@@33 $generated@@242 ($generated@@37 $generated@@239 $generated@@240)) ($generated@@38 $generated@@33 $generated@@242 ($generated@@37 $generated@@239 $generated@@240) $generated@@241))))) (and (forall (($generated@@243 T@U) ) (! (=> ($generated@@44 $generated@@243 $generated@@239) (and ($generated@@45 $generated@@242) (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@242) $generated@@243)) (and ($generated@@45 $generated@@242) true)))) - :pattern ( ($generated@@39 $generated@@239 $generated@@240 $generated@@241 ($generated@@40 $generated@@242) $generated@@243)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@242) $generated@@243)) -)) (= ($generated@@31 $generated@@239 $generated@@240 $generated@@242) (forall (($generated@@244 T@U) ) (! (=> (and ($generated@@44 $generated@@244 $generated@@239) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@242) $generated@@244))) ($generated@@39 $generated@@239 $generated@@240 $generated@@241 ($generated@@40 $generated@@242) $generated@@244)) - :pattern ( ($generated@@39 $generated@@239 $generated@@240 $generated@@241 ($generated@@40 $generated@@242) $generated@@244)) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@242) $generated@@244)) +(assert (=> (<= 0 $generated@@30) (forall (($generated@@236 T@U) ($generated@@237 T@U) ($generated@@238 T@U) ($generated@@239 T@U) ) (! (=> (or ($generated@@35 $generated@@236 $generated@@237 $generated@@239) (and (< 0 $generated@@30) (and ($generated@@34 $generated@@238) (and ($generated@@36 $generated@@33 $generated@@239 ($generated@@37 $generated@@236 $generated@@237)) ($generated@@38 $generated@@33 $generated@@239 ($generated@@37 $generated@@236 $generated@@237) $generated@@238))))) (and (forall (($generated@@240 T@U) ) (! (=> ($generated@@44 $generated@@240 $generated@@236) (and ($generated@@45 $generated@@239) (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@239) $generated@@240)) (and ($generated@@45 $generated@@239) true)))) + :pattern ( ($generated@@39 $generated@@236 $generated@@237 $generated@@238 ($generated@@40 $generated@@239) $generated@@240)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@239) $generated@@240)) +)) (= ($generated@@31 $generated@@236 $generated@@237 $generated@@239) (forall (($generated@@241 T@U) ) (! (=> (and ($generated@@44 $generated@@241 $generated@@236) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@239) $generated@@241))) ($generated@@39 $generated@@236 $generated@@237 $generated@@238 ($generated@@40 $generated@@239) $generated@@241)) + :pattern ( ($generated@@39 $generated@@236 $generated@@237 $generated@@238 ($generated@@40 $generated@@239) $generated@@241)) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@43 $generated@@239) $generated@@241)) ))))) - :pattern ( ($generated@@31 $generated@@239 $generated@@240 $generated@@242) ($generated@@34 $generated@@241)) + :pattern ( ($generated@@31 $generated@@236 $generated@@237 $generated@@239) ($generated@@34 $generated@@238)) )))) -(assert (forall (($generated@@245 T@U) ($generated@@246 T@U) ($generated@@247 T@U) ) (! (=> (or (not (= $generated@@245 $generated@@247)) (not true)) (=> (and ($generated@@103 $generated@@245 $generated@@246) ($generated@@103 $generated@@246 $generated@@247)) ($generated@@103 $generated@@245 $generated@@247))) - :pattern ( ($generated@@103 $generated@@245 $generated@@246) ($generated@@103 $generated@@246 $generated@@247)) +(assert (forall (($generated@@242 T@U) ($generated@@243 T@U) ($generated@@244 T@U) ) (! (=> (or (not (= $generated@@242 $generated@@244)) (not true)) (=> (and ($generated@@100 $generated@@242 $generated@@243) ($generated@@100 $generated@@243 $generated@@244)) ($generated@@100 $generated@@242 $generated@@244))) + :pattern ( ($generated@@100 $generated@@242 $generated@@243) ($generated@@100 $generated@@243 $generated@@244)) ))) -(assert (forall (($generated@@248 T@U) ($generated@@249 T@U) ($generated@@250 T@U) ) (! (= ($generated@@36 $generated@@47 $generated@@248 ($generated@@82 $generated@@249 $generated@@250)) (forall (($generated@@251 T@U) ($generated@@252 T@U) ) (! (=> (and (and ($generated@@34 $generated@@251) ($generated@@44 $generated@@252 $generated@@249)) ($generated@@39 $generated@@249 $generated@@250 $generated@@251 $generated@@248 $generated@@252)) ($generated@@44 ($generated@@172 $generated@@249 $generated@@250 $generated@@251 $generated@@248 $generated@@252) $generated@@250)) - :pattern ( ($generated@@172 $generated@@249 $generated@@250 $generated@@251 $generated@@248 $generated@@252)) +(assert (forall (($generated@@245 T@U) ($generated@@246 T@U) ($generated@@247 T@U) ) (! (= ($generated@@36 $generated@@47 $generated@@245 ($generated@@79 $generated@@246 $generated@@247)) (forall (($generated@@248 T@U) ($generated@@249 T@U) ) (! (=> (and (and ($generated@@34 $generated@@248) ($generated@@44 $generated@@249 $generated@@246)) ($generated@@39 $generated@@246 $generated@@247 $generated@@248 $generated@@245 $generated@@249)) ($generated@@44 ($generated@@169 $generated@@246 $generated@@247 $generated@@248 $generated@@245 $generated@@249) $generated@@247)) + :pattern ( ($generated@@169 $generated@@246 $generated@@247 $generated@@248 $generated@@245 $generated@@249)) ))) - :pattern ( ($generated@@36 $generated@@47 $generated@@248 ($generated@@82 $generated@@249 $generated@@250))) + :pattern ( ($generated@@36 $generated@@47 $generated@@245 ($generated@@79 $generated@@246 $generated@@247))) ))) -(assert (forall (($generated@@253 T@U) ($generated@@254 T@U) ($generated@@255 T@U) ($generated@@256 T@U) ) (! (=> ($generated@@34 $generated@@256) (= ($generated@@38 $generated@@47 $generated@@253 ($generated@@82 $generated@@254 $generated@@255) $generated@@256) (forall (($generated@@257 T@U) ) (! (=> (and (and ($generated@@44 $generated@@257 $generated@@254) ($generated@@151 $generated@@257 $generated@@254 $generated@@256)) ($generated@@39 $generated@@254 $generated@@255 $generated@@256 $generated@@253 $generated@@257)) (forall (($generated@@258 T@U) ) (! (=> (and (or (not (= $generated@@258 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@254 $generated@@255 $generated@@256 $generated@@253 $generated@@257) ($generated@@132 $generated@@91 $generated@@258)))) ($generated@@19 ($generated@@94 $generated@@15 ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@256 $generated@@258) $generated@@1)))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@254 $generated@@255 $generated@@256 $generated@@253 $generated@@257) ($generated@@132 $generated@@91 $generated@@258))) +(assert (forall (($generated@@250 T@U) ($generated@@251 T@U) ($generated@@252 T@U) ($generated@@253 T@U) ) (! (=> ($generated@@34 $generated@@253) (= ($generated@@38 $generated@@47 $generated@@250 ($generated@@79 $generated@@251 $generated@@252) $generated@@253) (forall (($generated@@254 T@U) ) (! (=> (and (and ($generated@@44 $generated@@254 $generated@@251) ($generated@@148 $generated@@254 $generated@@251 $generated@@253)) ($generated@@39 $generated@@251 $generated@@252 $generated@@253 $generated@@250 $generated@@254)) (forall (($generated@@255 T@U) ) (! (=> (and (or (not (= $generated@@255 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@251 $generated@@252 $generated@@253 $generated@@250 $generated@@254) ($generated@@129 $generated@@88 $generated@@255)))) ($generated@@19 ($generated@@91 $generated@@15 ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@253 $generated@@255) $generated@@1)))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@251 $generated@@252 $generated@@253 $generated@@250 $generated@@254) ($generated@@129 $generated@@88 $generated@@255))) ))) - :pattern ( ($generated@@172 $generated@@254 $generated@@255 $generated@@256 $generated@@253 $generated@@257)) - :pattern ( ($generated@@117 $generated@@254 $generated@@255 $generated@@256 $generated@@253 $generated@@257)) + :pattern ( ($generated@@169 $generated@@251 $generated@@252 $generated@@253 $generated@@250 $generated@@254)) + :pattern ( ($generated@@114 $generated@@251 $generated@@252 $generated@@253 $generated@@250 $generated@@254)) )))) - :pattern ( ($generated@@38 $generated@@47 $generated@@253 ($generated@@82 $generated@@254 $generated@@255) $generated@@256)) + :pattern ( ($generated@@38 $generated@@47 $generated@@250 ($generated@@79 $generated@@251 $generated@@252) $generated@@253)) ))) -(assert (forall (($generated@@259 T@U) ($generated@@260 T@U) ($generated@@261 T@T) ) (! (= ($generated@@44 ($generated@@132 $generated@@261 $generated@@259) $generated@@260) ($generated@@36 $generated@@261 $generated@@259 $generated@@260)) - :pattern ( ($generated@@44 ($generated@@132 $generated@@261 $generated@@259) $generated@@260)) +(assert (forall (($generated@@256 T@U) ($generated@@257 T@U) ($generated@@258 T@T) ) (! (= ($generated@@44 ($generated@@129 $generated@@258 $generated@@256) $generated@@257) ($generated@@36 $generated@@258 $generated@@256 $generated@@257)) + :pattern ( ($generated@@44 ($generated@@129 $generated@@258 $generated@@256) $generated@@257)) ))) -(assert (forall (($generated@@262 T@U) ($generated@@263 T@U) ($generated@@264 T@U) ($generated@@265 T@U) ($generated@@266 T@U) ($generated@@267 T@U) ($generated@@268 T@U) ) (! (=> ($generated@@19 ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@15 $generated@@266 $generated@@264 $generated@@268)) ($generated@@39 $generated@@262 $generated@@263 $generated@@264 ($generated@@173 $generated@@265 $generated@@266 $generated@@267) $generated@@268)) - :pattern ( ($generated@@39 $generated@@262 $generated@@263 $generated@@264 ($generated@@173 $generated@@265 $generated@@266 $generated@@267) $generated@@268)) +(assert (forall (($generated@@259 T@U) ($generated@@260 T@U) ($generated@@261 T@U) ($generated@@262 T@U) ($generated@@263 T@U) ($generated@@264 T@U) ($generated@@265 T@U) ) (! (=> ($generated@@19 ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@15 $generated@@263 $generated@@261 $generated@@265)) ($generated@@39 $generated@@259 $generated@@260 $generated@@261 ($generated@@170 $generated@@262 $generated@@263 $generated@@264) $generated@@265)) + :pattern ( ($generated@@39 $generated@@259 $generated@@260 $generated@@261 ($generated@@170 $generated@@262 $generated@@263 $generated@@264) $generated@@265)) ))) -(assert (forall (($generated@@270 T@U) ($generated@@271 T@U) ) (! (= ($generated@@269 ($generated@@82 $generated@@270 $generated@@271)) $generated@@270) - :pattern ( ($generated@@82 $generated@@270 $generated@@271)) +(assert (forall (($generated@@267 T@U) ($generated@@268 T@U) ) (! (= ($generated@@266 ($generated@@79 $generated@@267 $generated@@268)) $generated@@267) + :pattern ( ($generated@@79 $generated@@267 $generated@@268)) ))) -(assert (forall (($generated@@273 T@U) ($generated@@274 T@U) ) (! (= ($generated@@272 ($generated@@82 $generated@@273 $generated@@274)) $generated@@274) - :pattern ( ($generated@@82 $generated@@273 $generated@@274)) +(assert (forall (($generated@@270 T@U) ($generated@@271 T@U) ) (! (= ($generated@@269 ($generated@@79 $generated@@270 $generated@@271)) $generated@@271) + :pattern ( ($generated@@79 $generated@@270 $generated@@271)) ))) -(assert (forall (($generated@@276 T@U) ($generated@@277 T@U) ) (! (= ($generated@@275 ($generated@@98 $generated@@276 $generated@@277)) $generated@@276) - :pattern ( ($generated@@98 $generated@@276 $generated@@277)) +(assert (forall (($generated@@273 T@U) ($generated@@274 T@U) ) (! (= ($generated@@272 ($generated@@95 $generated@@273 $generated@@274)) $generated@@273) + :pattern ( ($generated@@95 $generated@@273 $generated@@274)) ))) -(assert (forall (($generated@@279 T@U) ($generated@@280 T@U) ) (! (= ($generated@@278 ($generated@@98 $generated@@279 $generated@@280)) $generated@@280) - :pattern ( ($generated@@98 $generated@@279 $generated@@280)) +(assert (forall (($generated@@276 T@U) ($generated@@277 T@U) ) (! (= ($generated@@275 ($generated@@95 $generated@@276 $generated@@277)) $generated@@277) + :pattern ( ($generated@@95 $generated@@276 $generated@@277)) ))) -(assert (forall (($generated@@281 T@U) ($generated@@282 T@U) ) (! (= ($generated@@80 ($generated@@126 $generated@@281 $generated@@282)) $generated@@7) - :pattern ( ($generated@@126 $generated@@281 $generated@@282)) +(assert (forall (($generated@@278 T@U) ($generated@@279 T@U) ) (! (= ($generated@@77 ($generated@@123 $generated@@278 $generated@@279)) $generated@@7) + :pattern ( ($generated@@123 $generated@@278 $generated@@279)) ))) -(assert (forall (($generated@@284 T@U) ($generated@@285 T@U) ) (! (= ($generated@@283 ($generated@@37 $generated@@284 $generated@@285)) $generated@@284) - :pattern ( ($generated@@37 $generated@@284 $generated@@285)) +(assert (forall (($generated@@281 T@U) ($generated@@282 T@U) ) (! (= ($generated@@280 ($generated@@37 $generated@@281 $generated@@282)) $generated@@281) + :pattern ( ($generated@@37 $generated@@281 $generated@@282)) ))) -(assert (forall (($generated@@287 T@U) ($generated@@288 T@U) ) (! (= ($generated@@286 ($generated@@37 $generated@@287 $generated@@288)) $generated@@288) - :pattern ( ($generated@@37 $generated@@287 $generated@@288)) +(assert (forall (($generated@@284 T@U) ($generated@@285 T@U) ) (! (= ($generated@@283 ($generated@@37 $generated@@284 $generated@@285)) $generated@@285) + :pattern ( ($generated@@37 $generated@@284 $generated@@285)) ))) -(assert (forall (($generated@@289 T@U) ($generated@@290 T@U) ) (! (= ($generated@@43 ($generated@@126 $generated@@289 $generated@@290)) $generated@@289) - :pattern ( ($generated@@126 $generated@@289 $generated@@290)) +(assert (forall (($generated@@286 T@U) ($generated@@287 T@U) ) (! (= ($generated@@43 ($generated@@123 $generated@@286 $generated@@287)) $generated@@286) + :pattern ( ($generated@@123 $generated@@286 $generated@@287)) ))) -(assert (forall (($generated@@291 T@U) ($generated@@292 T@U) ) (! (= ($generated@@40 ($generated@@126 $generated@@291 $generated@@292)) $generated@@292) - :pattern ( ($generated@@126 $generated@@291 $generated@@292)) +(assert (forall (($generated@@288 T@U) ($generated@@289 T@U) ) (! (= ($generated@@40 ($generated@@123 $generated@@288 $generated@@289)) $generated@@289) + :pattern ( ($generated@@123 $generated@@288 $generated@@289)) ))) -(assert (forall (($generated@@293 T@U) ) (! ($generated@@36 $generated@@91 $generated@@293 $generated@@92) - :pattern ( ($generated@@36 $generated@@91 $generated@@293 $generated@@92)) +(assert (forall (($generated@@290 T@U) ) (! ($generated@@36 $generated@@88 $generated@@290 $generated@@89) + :pattern ( ($generated@@36 $generated@@88 $generated@@290 $generated@@89)) ))) -(assert (forall (($generated@@295 T@U) ) (! (= ($generated@@294 ($generated@@107 $generated@@295)) $generated@@295) - :pattern ( ($generated@@107 $generated@@295)) +(assert (forall (($generated@@292 T@U) ) (! (= ($generated@@291 ($generated@@104 $generated@@292)) $generated@@292) + :pattern ( ($generated@@104 $generated@@292)) ))) -(assert (forall (($generated@@297 T@U) ) (! (= ($generated@@296 ($generated@@107 $generated@@297)) $generated) - :pattern ( ($generated@@107 $generated@@297)) +(assert (forall (($generated@@294 T@U) ) (! (= ($generated@@293 ($generated@@104 $generated@@294)) $generated) + :pattern ( ($generated@@104 $generated@@294)) ))) -(assert (forall (($generated@@299 T@U) ) (! (= ($generated@@298 ($generated@@111 $generated@@299)) $generated@@299) - :pattern ( ($generated@@111 $generated@@299)) +(assert (forall (($generated@@296 T@U) ) (! (= ($generated@@295 ($generated@@108 $generated@@296)) $generated@@296) + :pattern ( ($generated@@108 $generated@@296)) ))) -(assert (forall (($generated@@300 T@U) ) (! (= ($generated@@296 ($generated@@111 $generated@@300)) $generated@@0) - :pattern ( ($generated@@111 $generated@@300)) +(assert (forall (($generated@@297 T@U) ) (! (= ($generated@@293 ($generated@@108 $generated@@297)) $generated@@0) + :pattern ( ($generated@@108 $generated@@297)) ))) -(assert (forall (($generated@@301 T@U) ($generated@@302 T@T) ) (! (= ($generated@@94 $generated@@302 ($generated@@132 $generated@@302 $generated@@301)) $generated@@301) - :pattern ( ($generated@@132 $generated@@302 $generated@@301)) +(assert (forall (($generated@@298 T@U) ($generated@@299 T@T) ) (! (= ($generated@@91 $generated@@299 ($generated@@129 $generated@@299 $generated@@298)) $generated@@298) + :pattern ( ($generated@@129 $generated@@299 $generated@@298)) ))) -(assert (forall (($generated@@304 T@U) ($generated@@305 T@U) ($generated@@306 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@304 ($generated@@132 $generated@@33 $generated@@306))) (< ($generated@@303 $generated@@306) ($generated@@303 ($generated@@126 $generated@@304 $generated@@305)))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@304 ($generated@@132 $generated@@33 $generated@@306)) ($generated@@126 $generated@@304 $generated@@305)) +(assert (forall (($generated@@301 T@U) ($generated@@302 T@U) ($generated@@303 T@U) ) (! (=> ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@301 ($generated@@129 $generated@@33 $generated@@303))) (< ($generated@@300 $generated@@303) ($generated@@300 ($generated@@123 $generated@@301 $generated@@302)))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@301 ($generated@@129 $generated@@33 $generated@@303)) ($generated@@123 $generated@@301 $generated@@302)) ))) -(assert (forall (($generated@@307 T@U) ($generated@@308 T@U) ($generated@@309 T@U) ) (! (= ($generated@@36 $generated@@47 $generated@@309 ($generated@@98 $generated@@307 $generated@@308)) (and ($generated@@36 $generated@@47 $generated@@309 ($generated@@82 $generated@@307 $generated@@308)) (forall (($generated@@310 T@U) ) (=> ($generated@@44 $generated@@310 $generated@@307) ($generated@@119 ($generated@@117 $generated@@307 $generated@@308 $generated@@118 $generated@@309 $generated@@310) $generated@@120))))) - :pattern ( ($generated@@36 $generated@@47 $generated@@309 ($generated@@98 $generated@@307 $generated@@308))) +(assert (forall (($generated@@304 T@U) ($generated@@305 T@U) ($generated@@306 T@U) ) (! (= ($generated@@36 $generated@@47 $generated@@306 ($generated@@95 $generated@@304 $generated@@305)) (and ($generated@@36 $generated@@47 $generated@@306 ($generated@@79 $generated@@304 $generated@@305)) (forall (($generated@@307 T@U) ) (=> ($generated@@44 $generated@@307 $generated@@304) ($generated@@116 ($generated@@114 $generated@@304 $generated@@305 $generated@@115 $generated@@306 $generated@@307) $generated@@117))))) + :pattern ( ($generated@@36 $generated@@47 $generated@@306 ($generated@@95 $generated@@304 $generated@@305))) ))) -(assert (forall (($generated@@312 T@U) ($generated@@313 T@U) ($generated@@314 T@T) ) (! (= ($generated@@141 $generated@@314 $generated@@312 ($generated@@311 $generated@@313)) ($generated@@141 $generated@@314 $generated@@312 $generated@@313)) - :pattern ( ($generated@@141 $generated@@314 $generated@@312 ($generated@@311 $generated@@313))) +(assert (forall (($generated@@309 T@U) ($generated@@310 T@U) ($generated@@311 T@T) ) (! (= ($generated@@138 $generated@@311 $generated@@309 ($generated@@308 $generated@@310)) ($generated@@138 $generated@@311 $generated@@309 $generated@@310)) + :pattern ( ($generated@@138 $generated@@311 $generated@@309 ($generated@@308 $generated@@310))) ))) -(assert (forall (($generated@@315 T@U) ($generated@@316 T@U) ($generated@@317 T@U) ) (! (=> ($generated@@44 $generated@@317 ($generated@@82 $generated@@315 $generated@@316)) (and (= ($generated@@132 $generated@@47 ($generated@@94 $generated@@47 $generated@@317)) $generated@@317) ($generated@@36 $generated@@47 ($generated@@94 $generated@@47 $generated@@317) ($generated@@82 $generated@@315 $generated@@316)))) - :pattern ( ($generated@@44 $generated@@317 ($generated@@82 $generated@@315 $generated@@316))) +(assert (forall (($generated@@312 T@U) ($generated@@313 T@U) ($generated@@314 T@U) ) (! (=> ($generated@@44 $generated@@314 ($generated@@79 $generated@@312 $generated@@313)) (and (= ($generated@@129 $generated@@47 ($generated@@91 $generated@@47 $generated@@314)) $generated@@314) ($generated@@36 $generated@@47 ($generated@@91 $generated@@47 $generated@@314) ($generated@@79 $generated@@312 $generated@@313)))) + :pattern ( ($generated@@44 $generated@@314 ($generated@@79 $generated@@312 $generated@@313))) ))) -(assert (forall (($generated@@318 T@U) ($generated@@319 T@U) ($generated@@320 T@U) ) (! (=> ($generated@@44 $generated@@320 ($generated@@98 $generated@@318 $generated@@319)) (and (= ($generated@@132 $generated@@47 ($generated@@94 $generated@@47 $generated@@320)) $generated@@320) ($generated@@36 $generated@@47 ($generated@@94 $generated@@47 $generated@@320) ($generated@@98 $generated@@318 $generated@@319)))) - :pattern ( ($generated@@44 $generated@@320 ($generated@@98 $generated@@318 $generated@@319))) +(assert (forall (($generated@@315 T@U) ($generated@@316 T@U) ($generated@@317 T@U) ) (! (=> ($generated@@44 $generated@@317 ($generated@@95 $generated@@315 $generated@@316)) (and (= ($generated@@129 $generated@@47 ($generated@@91 $generated@@47 $generated@@317)) $generated@@317) ($generated@@36 $generated@@47 ($generated@@91 $generated@@47 $generated@@317) ($generated@@95 $generated@@315 $generated@@316)))) + :pattern ( ($generated@@44 $generated@@317 ($generated@@95 $generated@@315 $generated@@316))) ))) -(assert (forall (($generated@@321 T@U) ($generated@@322 T@U) ($generated@@323 T@U) ) (! (=> ($generated@@44 $generated@@323 ($generated@@37 $generated@@321 $generated@@322)) (and (= ($generated@@132 $generated@@33 ($generated@@94 $generated@@33 $generated@@323)) $generated@@323) ($generated@@36 $generated@@33 ($generated@@94 $generated@@33 $generated@@323) ($generated@@37 $generated@@321 $generated@@322)))) - :pattern ( ($generated@@44 $generated@@323 ($generated@@37 $generated@@321 $generated@@322))) +(assert (forall (($generated@@318 T@U) ($generated@@319 T@U) ($generated@@320 T@U) ) (! (=> ($generated@@44 $generated@@320 ($generated@@37 $generated@@318 $generated@@319)) (and (= ($generated@@129 $generated@@33 ($generated@@91 $generated@@33 $generated@@320)) $generated@@320) ($generated@@36 $generated@@33 ($generated@@91 $generated@@33 $generated@@320) ($generated@@37 $generated@@318 $generated@@319)))) + :pattern ( ($generated@@44 $generated@@320 ($generated@@37 $generated@@318 $generated@@319))) ))) -(assert (forall (($generated@@324 T@U) ) (! (not ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@120 $generated@@324))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@120 $generated@@324)) +(assert (forall (($generated@@321 T@U) ) (! (not ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@117 $generated@@321))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@117 $generated@@321)) ))) -(assert (forall (($generated@@326 T@U) ) (! (not ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@325 $generated@@326))) - :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@325 $generated@@326)) +(assert (forall (($generated@@323 T@U) ) (! (not ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 $generated@@322 $generated@@323))) + :pattern ( ($generated@@41 $generated@@42 $generated@@15 $generated@@322 $generated@@323)) ))) -(assert (forall (($generated@@328 T@U) ($generated@@329 T@U) ($generated@@330 T@U) ($generated@@331 Bool) ($generated@@332 T@U) ($generated@@333 T@U) ) (! (= ($generated@@19 ($generated@@174 $generated@@91 $generated@@95 $generated@@15 ($generated@@327 $generated@@328 $generated@@329 $generated@@330 $generated@@331) $generated@@332 $generated@@333)) (=> (and (or (not (= $generated@@332 $generated@@328)) (not true)) ($generated@@19 ($generated@@94 $generated@@15 ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@329 $generated@@332) $generated@@330)))) $generated@@331)) - :pattern ( ($generated@@174 $generated@@91 $generated@@95 $generated@@15 ($generated@@327 $generated@@328 $generated@@329 $generated@@330 $generated@@331) $generated@@332 $generated@@333)) +(assert (forall (($generated@@325 T@U) ($generated@@326 T@U) ($generated@@327 T@U) ($generated@@328 Bool) ($generated@@329 T@U) ($generated@@330 T@U) ) (! (= ($generated@@19 ($generated@@171 $generated@@88 $generated@@92 $generated@@15 ($generated@@324 $generated@@325 $generated@@326 $generated@@327 $generated@@328) $generated@@329 $generated@@330)) (=> (and (or (not (= $generated@@329 $generated@@325)) (not true)) ($generated@@19 ($generated@@91 $generated@@15 ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@326 $generated@@329) $generated@@327)))) $generated@@328)) + :pattern ( ($generated@@171 $generated@@88 $generated@@92 $generated@@15 ($generated@@324 $generated@@325 $generated@@326 $generated@@327 $generated@@328) $generated@@329 $generated@@330)) ))) -(assert (forall (($generated@@335 T@U) ($generated@@336 T@U) ) (! (and (= ($generated@@296 ($generated@@82 $generated@@335 $generated@@336)) $generated@@3) (= ($generated@@334 ($generated@@82 $generated@@335 $generated@@336)) $generated@@10)) - :pattern ( ($generated@@82 $generated@@335 $generated@@336)) +(assert (forall (($generated@@332 T@U) ($generated@@333 T@U) ) (! (and (= ($generated@@293 ($generated@@79 $generated@@332 $generated@@333)) $generated@@3) (= ($generated@@331 ($generated@@79 $generated@@332 $generated@@333)) $generated@@10)) + :pattern ( ($generated@@79 $generated@@332 $generated@@333)) ))) -(assert (forall (($generated@@337 T@U) ($generated@@338 T@U) ) (! (and (= ($generated@@296 ($generated@@98 $generated@@337 $generated@@338)) $generated@@4) (= ($generated@@334 ($generated@@98 $generated@@337 $generated@@338)) $generated@@11)) - :pattern ( ($generated@@98 $generated@@337 $generated@@338)) +(assert (forall (($generated@@334 T@U) ($generated@@335 T@U) ) (! (and (= ($generated@@293 ($generated@@95 $generated@@334 $generated@@335)) $generated@@4) (= ($generated@@331 ($generated@@95 $generated@@334 $generated@@335)) $generated@@11)) + :pattern ( ($generated@@95 $generated@@334 $generated@@335)) ))) -(assert (forall (($generated@@339 T@U) ($generated@@340 T@U) ) (! (and (= ($generated@@296 ($generated@@37 $generated@@339 $generated@@340)) $generated@@8) (= ($generated@@334 ($generated@@37 $generated@@339 $generated@@340)) $generated@@13)) - :pattern ( ($generated@@37 $generated@@339 $generated@@340)) +(assert (forall (($generated@@336 T@U) ($generated@@337 T@U) ) (! (and (= ($generated@@293 ($generated@@37 $generated@@336 $generated@@337)) $generated@@8) (= ($generated@@331 ($generated@@37 $generated@@336 $generated@@337)) $generated@@13)) + :pattern ( ($generated@@37 $generated@@336 $generated@@337)) ))) -(assert (forall (($generated@@341 T@U) ($generated@@342 T@U) ($generated@@343 T@U) ($generated@@344 T@U) ($generated@@345 T@U) ) (! (=> (and (and ($generated@@34 $generated@@343) (and ($generated@@44 $generated@@345 $generated@@341) ($generated@@36 $generated@@47 $generated@@344 ($generated@@82 $generated@@341 $generated@@342)))) ($generated@@119 ($generated@@117 $generated@@341 $generated@@342 $generated@@118 $generated@@344 $generated@@345) $generated@@120)) (= ($generated@@39 $generated@@341 $generated@@342 $generated@@118 $generated@@344 $generated@@345) ($generated@@39 $generated@@341 $generated@@342 $generated@@343 $generated@@344 $generated@@345))) - :pattern ( ($generated@@39 $generated@@341 $generated@@342 $generated@@118 $generated@@344 $generated@@345) ($generated@@34 $generated@@343)) - :pattern ( ($generated@@39 $generated@@341 $generated@@342 $generated@@343 $generated@@344 $generated@@345)) +(assert (forall (($generated@@338 T@U) ($generated@@339 T@U) ($generated@@340 T@U) ($generated@@341 T@U) ($generated@@342 T@U) ) (! (=> (and (and ($generated@@34 $generated@@340) (and ($generated@@44 $generated@@342 $generated@@338) ($generated@@36 $generated@@47 $generated@@341 ($generated@@79 $generated@@338 $generated@@339)))) ($generated@@116 ($generated@@114 $generated@@338 $generated@@339 $generated@@115 $generated@@341 $generated@@342) $generated@@117)) (= ($generated@@39 $generated@@338 $generated@@339 $generated@@115 $generated@@341 $generated@@342) ($generated@@39 $generated@@338 $generated@@339 $generated@@340 $generated@@341 $generated@@342))) + :pattern ( ($generated@@39 $generated@@338 $generated@@339 $generated@@115 $generated@@341 $generated@@342) ($generated@@34 $generated@@340)) + :pattern ( ($generated@@39 $generated@@338 $generated@@339 $generated@@340 $generated@@341 $generated@@342)) ))) -(assert (forall (($generated@@346 T@U) ($generated@@347 T@U) ) (! (=> ($generated@@44 $generated@@346 ($generated@@107 $generated@@347)) (and (= ($generated@@132 ($generated@@46 $generated@@42 $generated@@15) ($generated@@94 ($generated@@46 $generated@@42 $generated@@15) $generated@@346)) $generated@@346) ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@94 ($generated@@46 $generated@@42 $generated@@15) $generated@@346) ($generated@@107 $generated@@347)))) - :pattern ( ($generated@@44 $generated@@346 ($generated@@107 $generated@@347))) +(assert (forall (($generated@@343 T@U) ($generated@@344 T@U) ) (! (=> ($generated@@44 $generated@@343 ($generated@@104 $generated@@344)) (and (= ($generated@@129 ($generated@@46 $generated@@42 $generated@@15) ($generated@@91 ($generated@@46 $generated@@42 $generated@@15) $generated@@343)) $generated@@343) ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@91 ($generated@@46 $generated@@42 $generated@@15) $generated@@343) ($generated@@104 $generated@@344)))) + :pattern ( ($generated@@44 $generated@@343 ($generated@@104 $generated@@344))) ))) -(assert (forall (($generated@@348 T@U) ($generated@@349 T@U) ) (! (=> ($generated@@44 $generated@@348 ($generated@@111 $generated@@349)) (and (= ($generated@@132 ($generated@@46 $generated@@42 $generated@@15) ($generated@@94 ($generated@@46 $generated@@42 $generated@@15) $generated@@348)) $generated@@348) ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@94 ($generated@@46 $generated@@42 $generated@@15) $generated@@348) ($generated@@111 $generated@@349)))) - :pattern ( ($generated@@44 $generated@@348 ($generated@@111 $generated@@349))) +(assert (forall (($generated@@345 T@U) ($generated@@346 T@U) ) (! (=> ($generated@@44 $generated@@345 ($generated@@108 $generated@@346)) (and (= ($generated@@129 ($generated@@46 $generated@@42 $generated@@15) ($generated@@91 ($generated@@46 $generated@@42 $generated@@15) $generated@@345)) $generated@@345) ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@91 ($generated@@46 $generated@@42 $generated@@15) $generated@@345) ($generated@@108 $generated@@346)))) + :pattern ( ($generated@@44 $generated@@345 ($generated@@108 $generated@@346))) ))) -(assert (forall (($generated@@350 T@U) ($generated@@351 T@U) ) (! (=> (and ($generated@@34 $generated@@351) ($generated@@36 $generated@@33 $generated@@350 $generated@@90)) ($generated@@38 $generated@@33 $generated@@350 $generated@@90 $generated@@351)) - :pattern ( ($generated@@38 $generated@@33 $generated@@350 $generated@@90 $generated@@351)) +(assert (forall (($generated@@347 T@U) ($generated@@348 T@U) ) (! (=> (and ($generated@@34 $generated@@348) ($generated@@36 $generated@@33 $generated@@347 $generated@@87)) ($generated@@38 $generated@@33 $generated@@347 $generated@@87 $generated@@348)) + :pattern ( ($generated@@38 $generated@@33 $generated@@347 $generated@@87 $generated@@348)) ))) -(assert (= ($generated@@296 $generated@@92) $generated@@2)) -(assert (= ($generated@@334 $generated@@92) $generated@@9)) -(assert (= ($generated@@296 $generated@@90) $generated@@6)) -(assert (= ($generated@@334 $generated@@90) $generated@@12)) -(assert (= $generated@@81 ($generated@@32 $generated@@33 $generated@@81))) -(assert (forall (($generated@@352 T@U) ) (! ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@138 $generated@@352) ($generated@@107 $generated@@92)) - :pattern ( ($generated@@138 $generated@@352)) +(assert (= ($generated@@293 $generated@@89) $generated@@2)) +(assert (= ($generated@@331 $generated@@89) $generated@@9)) +(assert (= ($generated@@293 $generated@@87) $generated@@6)) +(assert (= ($generated@@331 $generated@@87) $generated@@12)) +(assert (= $generated@@78 ($generated@@32 $generated@@33 $generated@@78))) +(assert (forall (($generated@@349 T@U) ) (! ($generated@@36 ($generated@@46 $generated@@42 $generated@@15) ($generated@@135 $generated@@349) ($generated@@104 $generated@@89)) + :pattern ( ($generated@@135 $generated@@349)) ))) -(assert (forall (($generated@@353 T@U) ($generated@@354 T@U) ($generated@@355 T@U) ($generated@@356 T@U) ($generated@@357 T@U) ($generated@@358 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@355 $generated@@356) (and ($generated@@34 $generated@@355) ($generated@@34 $generated@@356))) (and ($generated@@44 $generated@@358 $generated@@353) ($generated@@36 $generated@@47 $generated@@357 ($generated@@82 $generated@@353 $generated@@354)))) (forall (($generated@@359 T@U) ($generated@@360 T@U) ) (=> (and (or (not (= $generated@@359 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@353 $generated@@354 $generated@@355 $generated@@357 $generated@@358) ($generated@@132 $generated@@91 $generated@@359)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@355 $generated@@359) $generated@@360) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@356 $generated@@359) $generated@@360))))) (= ($generated@@39 $generated@@353 $generated@@354 $generated@@355 $generated@@357 $generated@@358) ($generated@@39 $generated@@353 $generated@@354 $generated@@356 $generated@@357 $generated@@358))) - :pattern ( ($generated@@103 $generated@@355 $generated@@356) ($generated@@39 $generated@@353 $generated@@354 $generated@@356 $generated@@357 $generated@@358)) +(assert (forall (($generated@@350 T@U) ($generated@@351 T@U) ($generated@@352 T@U) ($generated@@353 T@U) ($generated@@354 T@U) ($generated@@355 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@352 $generated@@353) (and ($generated@@34 $generated@@352) ($generated@@34 $generated@@353))) (and ($generated@@44 $generated@@355 $generated@@350) ($generated@@36 $generated@@47 $generated@@354 ($generated@@79 $generated@@350 $generated@@351)))) (forall (($generated@@356 T@U) ($generated@@357 T@U) ) (=> (and (or (not (= $generated@@356 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@350 $generated@@351 $generated@@352 $generated@@354 $generated@@355) ($generated@@129 $generated@@88 $generated@@356)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@352 $generated@@356) $generated@@357) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@353 $generated@@356) $generated@@357))))) (= ($generated@@39 $generated@@350 $generated@@351 $generated@@352 $generated@@354 $generated@@355) ($generated@@39 $generated@@350 $generated@@351 $generated@@353 $generated@@354 $generated@@355))) + :pattern ( ($generated@@100 $generated@@352 $generated@@353) ($generated@@39 $generated@@350 $generated@@351 $generated@@353 $generated@@354 $generated@@355)) ))) -(assert (forall (($generated@@361 T@U) ($generated@@362 T@U) ($generated@@363 T@U) ($generated@@364 T@U) ($generated@@365 T@U) ($generated@@366 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@363 $generated@@364) (and ($generated@@34 $generated@@363) ($generated@@34 $generated@@364))) (and ($generated@@44 $generated@@366 $generated@@361) ($generated@@36 $generated@@47 $generated@@365 ($generated@@82 $generated@@361 $generated@@362)))) (forall (($generated@@367 T@U) ($generated@@368 T@U) ) (=> (and (or (not (= $generated@@367 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@361 $generated@@362 $generated@@364 $generated@@365 $generated@@366) ($generated@@132 $generated@@91 $generated@@367)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@363 $generated@@367) $generated@@368) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@364 $generated@@367) $generated@@368))))) (= ($generated@@39 $generated@@361 $generated@@362 $generated@@363 $generated@@365 $generated@@366) ($generated@@39 $generated@@361 $generated@@362 $generated@@364 $generated@@365 $generated@@366))) - :pattern ( ($generated@@103 $generated@@363 $generated@@364) ($generated@@39 $generated@@361 $generated@@362 $generated@@364 $generated@@365 $generated@@366)) +(assert (forall (($generated@@358 T@U) ($generated@@359 T@U) ($generated@@360 T@U) ($generated@@361 T@U) ($generated@@362 T@U) ($generated@@363 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@360 $generated@@361) (and ($generated@@34 $generated@@360) ($generated@@34 $generated@@361))) (and ($generated@@44 $generated@@363 $generated@@358) ($generated@@36 $generated@@47 $generated@@362 ($generated@@79 $generated@@358 $generated@@359)))) (forall (($generated@@364 T@U) ($generated@@365 T@U) ) (=> (and (or (not (= $generated@@364 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@358 $generated@@359 $generated@@361 $generated@@362 $generated@@363) ($generated@@129 $generated@@88 $generated@@364)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@360 $generated@@364) $generated@@365) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@361 $generated@@364) $generated@@365))))) (= ($generated@@39 $generated@@358 $generated@@359 $generated@@360 $generated@@362 $generated@@363) ($generated@@39 $generated@@358 $generated@@359 $generated@@361 $generated@@362 $generated@@363))) + :pattern ( ($generated@@100 $generated@@360 $generated@@361) ($generated@@39 $generated@@358 $generated@@359 $generated@@361 $generated@@362 $generated@@363)) ))) -(assert (forall (($generated@@369 T@U) ($generated@@370 T@U) ) (! (= ($generated@@126 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@369) ($generated@@32 $generated@@47 $generated@@370)) ($generated@@32 $generated@@33 ($generated@@126 $generated@@369 $generated@@370))) - :pattern ( ($generated@@126 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@369) ($generated@@32 $generated@@47 $generated@@370))) +(assert (forall (($generated@@366 T@U) ($generated@@367 T@U) ) (! (= ($generated@@123 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@366) ($generated@@32 $generated@@47 $generated@@367)) ($generated@@32 $generated@@33 ($generated@@123 $generated@@366 $generated@@367))) + :pattern ( ($generated@@123 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@366) ($generated@@32 $generated@@47 $generated@@367))) ))) -(assert (forall (($generated@@371 T@U) ($generated@@372 T@T) ) (! (= ($generated@@132 $generated@@372 ($generated@@32 $generated@@372 $generated@@371)) ($generated@@32 $generated@@42 ($generated@@132 $generated@@372 $generated@@371))) - :pattern ( ($generated@@132 $generated@@372 ($generated@@32 $generated@@372 $generated@@371))) +(assert (forall (($generated@@368 T@U) ($generated@@369 T@T) ) (! (= ($generated@@129 $generated@@369 ($generated@@32 $generated@@369 $generated@@368)) ($generated@@32 $generated@@42 ($generated@@129 $generated@@369 $generated@@368))) + :pattern ( ($generated@@129 $generated@@369 ($generated@@32 $generated@@369 $generated@@368))) ))) -(assert (forall (($generated@@373 T@U) ($generated@@374 T@U) ($generated@@375 T@U) ($generated@@376 T@U) ($generated@@377 T@U) ($generated@@378 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@375 $generated@@376) (and ($generated@@34 $generated@@375) ($generated@@34 $generated@@376))) (and ($generated@@44 $generated@@378 $generated@@373) ($generated@@36 $generated@@47 $generated@@377 ($generated@@82 $generated@@373 $generated@@374)))) (forall (($generated@@379 T@U) ($generated@@380 T@U) ) (=> (and (or (not (= $generated@@379 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@373 $generated@@374 $generated@@375 $generated@@377 $generated@@378) ($generated@@132 $generated@@91 $generated@@379)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@375 $generated@@379) $generated@@380) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@376 $generated@@379) $generated@@380))))) (= ($generated@@117 $generated@@373 $generated@@374 $generated@@375 $generated@@377 $generated@@378) ($generated@@117 $generated@@373 $generated@@374 $generated@@376 $generated@@377 $generated@@378))) - :pattern ( ($generated@@103 $generated@@375 $generated@@376) ($generated@@117 $generated@@373 $generated@@374 $generated@@376 $generated@@377 $generated@@378)) +(assert (forall (($generated@@370 T@U) ($generated@@371 T@U) ($generated@@372 T@U) ($generated@@373 T@U) ($generated@@374 T@U) ($generated@@375 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@372 $generated@@373) (and ($generated@@34 $generated@@372) ($generated@@34 $generated@@373))) (and ($generated@@44 $generated@@375 $generated@@370) ($generated@@36 $generated@@47 $generated@@374 ($generated@@79 $generated@@370 $generated@@371)))) (forall (($generated@@376 T@U) ($generated@@377 T@U) ) (=> (and (or (not (= $generated@@376 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@370 $generated@@371 $generated@@372 $generated@@374 $generated@@375) ($generated@@129 $generated@@88 $generated@@376)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@372 $generated@@376) $generated@@377) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@373 $generated@@376) $generated@@377))))) (= ($generated@@114 $generated@@370 $generated@@371 $generated@@372 $generated@@374 $generated@@375) ($generated@@114 $generated@@370 $generated@@371 $generated@@373 $generated@@374 $generated@@375))) + :pattern ( ($generated@@100 $generated@@372 $generated@@373) ($generated@@114 $generated@@370 $generated@@371 $generated@@373 $generated@@374 $generated@@375)) ))) -(assert (forall (($generated@@381 T@U) ($generated@@382 T@U) ($generated@@383 T@U) ($generated@@384 T@U) ($generated@@385 T@U) ($generated@@386 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@383 $generated@@384) (and ($generated@@34 $generated@@383) ($generated@@34 $generated@@384))) (and ($generated@@44 $generated@@386 $generated@@381) ($generated@@36 $generated@@47 $generated@@385 ($generated@@82 $generated@@381 $generated@@382)))) (forall (($generated@@387 T@U) ($generated@@388 T@U) ) (=> (and (or (not (= $generated@@387 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@381 $generated@@382 $generated@@384 $generated@@385 $generated@@386) ($generated@@132 $generated@@91 $generated@@387)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@383 $generated@@387) $generated@@388) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@384 $generated@@387) $generated@@388))))) (= ($generated@@117 $generated@@381 $generated@@382 $generated@@383 $generated@@385 $generated@@386) ($generated@@117 $generated@@381 $generated@@382 $generated@@384 $generated@@385 $generated@@386))) - :pattern ( ($generated@@103 $generated@@383 $generated@@384) ($generated@@117 $generated@@381 $generated@@382 $generated@@384 $generated@@385 $generated@@386)) +(assert (forall (($generated@@378 T@U) ($generated@@379 T@U) ($generated@@380 T@U) ($generated@@381 T@U) ($generated@@382 T@U) ($generated@@383 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@380 $generated@@381) (and ($generated@@34 $generated@@380) ($generated@@34 $generated@@381))) (and ($generated@@44 $generated@@383 $generated@@378) ($generated@@36 $generated@@47 $generated@@382 ($generated@@79 $generated@@378 $generated@@379)))) (forall (($generated@@384 T@U) ($generated@@385 T@U) ) (=> (and (or (not (= $generated@@384 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@378 $generated@@379 $generated@@381 $generated@@382 $generated@@383) ($generated@@129 $generated@@88 $generated@@384)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@380 $generated@@384) $generated@@385) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@381 $generated@@384) $generated@@385))))) (= ($generated@@114 $generated@@378 $generated@@379 $generated@@380 $generated@@382 $generated@@383) ($generated@@114 $generated@@378 $generated@@379 $generated@@381 $generated@@382 $generated@@383))) + :pattern ( ($generated@@100 $generated@@380 $generated@@381) ($generated@@114 $generated@@378 $generated@@379 $generated@@381 $generated@@382 $generated@@383)) ))) -(assert (forall (($generated@@389 T@U) ($generated@@390 T@U) ($generated@@391 T@U) ($generated@@392 T@U) ($generated@@393 T@U) ($generated@@394 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@391 $generated@@392) (and ($generated@@34 $generated@@391) ($generated@@34 $generated@@392))) (and ($generated@@44 $generated@@394 $generated@@389) ($generated@@36 $generated@@47 $generated@@393 ($generated@@82 $generated@@389 $generated@@390)))) (forall (($generated@@395 T@U) ($generated@@396 T@U) ) (=> (and (or (not (= $generated@@395 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@389 $generated@@390 $generated@@391 $generated@@393 $generated@@394) ($generated@@132 $generated@@91 $generated@@395)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@391 $generated@@395) $generated@@396) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@392 $generated@@395) $generated@@396))))) (= ($generated@@172 $generated@@389 $generated@@390 $generated@@391 $generated@@393 $generated@@394) ($generated@@172 $generated@@389 $generated@@390 $generated@@392 $generated@@393 $generated@@394))) - :pattern ( ($generated@@103 $generated@@391 $generated@@392) ($generated@@172 $generated@@389 $generated@@390 $generated@@392 $generated@@393 $generated@@394)) +(assert (forall (($generated@@386 T@U) ($generated@@387 T@U) ($generated@@388 T@U) ($generated@@389 T@U) ($generated@@390 T@U) ($generated@@391 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@388 $generated@@389) (and ($generated@@34 $generated@@388) ($generated@@34 $generated@@389))) (and ($generated@@44 $generated@@391 $generated@@386) ($generated@@36 $generated@@47 $generated@@390 ($generated@@79 $generated@@386 $generated@@387)))) (forall (($generated@@392 T@U) ($generated@@393 T@U) ) (=> (and (or (not (= $generated@@392 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@386 $generated@@387 $generated@@388 $generated@@390 $generated@@391) ($generated@@129 $generated@@88 $generated@@392)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@388 $generated@@392) $generated@@393) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@389 $generated@@392) $generated@@393))))) (= ($generated@@169 $generated@@386 $generated@@387 $generated@@388 $generated@@390 $generated@@391) ($generated@@169 $generated@@386 $generated@@387 $generated@@389 $generated@@390 $generated@@391))) + :pattern ( ($generated@@100 $generated@@388 $generated@@389) ($generated@@169 $generated@@386 $generated@@387 $generated@@389 $generated@@390 $generated@@391)) ))) -(assert (forall (($generated@@397 T@U) ($generated@@398 T@U) ($generated@@399 T@U) ($generated@@400 T@U) ($generated@@401 T@U) ($generated@@402 T@U) ) (! (=> (and (and (and ($generated@@103 $generated@@399 $generated@@400) (and ($generated@@34 $generated@@399) ($generated@@34 $generated@@400))) (and ($generated@@44 $generated@@402 $generated@@397) ($generated@@36 $generated@@47 $generated@@401 ($generated@@82 $generated@@397 $generated@@398)))) (forall (($generated@@403 T@U) ($generated@@404 T@U) ) (=> (and (or (not (= $generated@@403 $generated@@93)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@117 $generated@@397 $generated@@398 $generated@@400 $generated@@401 $generated@@402) ($generated@@132 $generated@@91 $generated@@403)))) (= ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@399 $generated@@403) $generated@@404) ($generated@@41 $generated@@95 $generated@@42 ($generated@@41 $generated@@91 ($generated@@46 $generated@@95 $generated@@42) $generated@@400 $generated@@403) $generated@@404))))) (= ($generated@@172 $generated@@397 $generated@@398 $generated@@399 $generated@@401 $generated@@402) ($generated@@172 $generated@@397 $generated@@398 $generated@@400 $generated@@401 $generated@@402))) - :pattern ( ($generated@@103 $generated@@399 $generated@@400) ($generated@@172 $generated@@397 $generated@@398 $generated@@400 $generated@@401 $generated@@402)) +(assert (forall (($generated@@394 T@U) ($generated@@395 T@U) ($generated@@396 T@U) ($generated@@397 T@U) ($generated@@398 T@U) ($generated@@399 T@U) ) (! (=> (and (and (and ($generated@@100 $generated@@396 $generated@@397) (and ($generated@@34 $generated@@396) ($generated@@34 $generated@@397))) (and ($generated@@44 $generated@@399 $generated@@394) ($generated@@36 $generated@@47 $generated@@398 ($generated@@79 $generated@@394 $generated@@395)))) (forall (($generated@@400 T@U) ($generated@@401 T@U) ) (=> (and (or (not (= $generated@@400 $generated@@90)) (not true)) ($generated@@19 ($generated@@41 $generated@@42 $generated@@15 ($generated@@114 $generated@@394 $generated@@395 $generated@@397 $generated@@398 $generated@@399) ($generated@@129 $generated@@88 $generated@@400)))) (= ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@396 $generated@@400) $generated@@401) ($generated@@41 $generated@@92 $generated@@42 ($generated@@41 $generated@@88 ($generated@@46 $generated@@92 $generated@@42) $generated@@397 $generated@@400) $generated@@401))))) (= ($generated@@169 $generated@@394 $generated@@395 $generated@@396 $generated@@398 $generated@@399) ($generated@@169 $generated@@394 $generated@@395 $generated@@397 $generated@@398 $generated@@399))) + :pattern ( ($generated@@100 $generated@@396 $generated@@397) ($generated@@169 $generated@@394 $generated@@395 $generated@@397 $generated@@398 $generated@@399)) ))) -(assert (forall (($generated@@405 T@U) ($generated@@406 T@U) ($generated@@407 T@U) ) (! (=> (and ($generated@@34 $generated@@407) (and ($generated@@45 $generated@@405) (exists (($generated@@408 T@U) ) (! ($generated@@38 $generated@@33 $generated@@405 ($generated@@37 $generated@@406 $generated@@408) $generated@@407) - :pattern ( ($generated@@38 $generated@@33 $generated@@405 ($generated@@37 $generated@@406 $generated@@408) $generated@@407)) -)))) ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) ($generated@@43 $generated@@405) ($generated@@111 $generated@@406) $generated@@407)) - :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) ($generated@@43 $generated@@405) ($generated@@111 $generated@@406) $generated@@407)) +(assert (forall (($generated@@402 T@U) ($generated@@403 T@U) ($generated@@404 T@U) ) (! (=> (and ($generated@@34 $generated@@404) (and ($generated@@45 $generated@@402) (exists (($generated@@405 T@U) ) (! ($generated@@38 $generated@@33 $generated@@402 ($generated@@37 $generated@@403 $generated@@405) $generated@@404) + :pattern ( ($generated@@38 $generated@@33 $generated@@402 ($generated@@37 $generated@@403 $generated@@405) $generated@@404)) +)))) ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) ($generated@@43 $generated@@402) ($generated@@108 $generated@@403) $generated@@404)) + :pattern ( ($generated@@38 ($generated@@46 $generated@@42 $generated@@15) ($generated@@43 $generated@@402) ($generated@@108 $generated@@403) $generated@@404)) ))) -(assert (forall (($generated@@410 T@U) ($generated@@411 T@U) ($generated@@412 T@U) ) (! (= ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) ($generated@@409 $generated@@410) $generated@@411 $generated@@412) $generated@@410) - :pattern ( ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) ($generated@@409 $generated@@410) $generated@@411 $generated@@412)) +(assert (forall (($generated@@407 T@U) ($generated@@408 T@U) ($generated@@409 T@U) ) (! (= ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) ($generated@@406 $generated@@407) $generated@@408 $generated@@409) $generated@@407) + :pattern ( ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 ($generated@@46 $generated@@42 $generated@@15) ($generated@@406 $generated@@407) $generated@@408 $generated@@409)) ))) -(assert (forall (($generated@@414 T@U) ($generated@@415 T@U) ($generated@@416 T@U) ) (! (= ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@42 ($generated@@413 $generated@@414) $generated@@415 $generated@@416) $generated@@414) - :pattern ( ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@42 ($generated@@413 $generated@@414) $generated@@415 $generated@@416)) +(assert (forall (($generated@@411 T@U) ($generated@@412 T@U) ($generated@@413 T@U) ) (! (= ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@42 ($generated@@410 $generated@@411) $generated@@412 $generated@@413) $generated@@411) + :pattern ( ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@42 ($generated@@410 $generated@@411) $generated@@412 $generated@@413)) ))) -(assert (forall (($generated@@418 T@U) ($generated@@419 Bool) ($generated@@420 T@U) ($generated@@421 T@U) ) (! (= ($generated@@19 ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@15 ($generated@@417 $generated@@418 $generated@@419) $generated@@420 $generated@@421)) (and ($generated@@44 $generated@@421 $generated@@418) $generated@@419)) - :pattern ( ($generated@@174 ($generated@@46 $generated@@91 ($generated@@46 $generated@@95 $generated@@42)) $generated@@42 $generated@@15 ($generated@@417 $generated@@418 $generated@@419) $generated@@420 $generated@@421)) +(assert (forall (($generated@@415 T@U) ($generated@@416 Bool) ($generated@@417 T@U) ($generated@@418 T@U) ) (! (= ($generated@@19 ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@15 ($generated@@414 $generated@@415 $generated@@416) $generated@@417 $generated@@418)) (and ($generated@@44 $generated@@418 $generated@@415) $generated@@416)) + :pattern ( ($generated@@171 ($generated@@46 $generated@@88 ($generated@@46 $generated@@92 $generated@@42)) $generated@@42 $generated@@15 ($generated@@414 $generated@@415 $generated@@416) $generated@@417 $generated@@418)) ))) (push 1) (declare-fun ControlFlow (Int Int) Int) +(declare-fun $generated@@419 () T@U) +(declare-fun $generated@@420 () T@U) +(declare-fun $generated@@421 () T@U) (declare-fun $generated@@422 () T@U) (declare-fun $generated@@423 () T@U) (declare-fun $generated@@424 () T@U) (declare-fun $generated@@425 () T@U) (declare-fun $generated@@426 () T@U) (declare-fun $generated@@427 () T@U) -(declare-fun $generated@@428 () T@U) +(declare-fun $generated@@428 (T@U) Bool) (declare-fun $generated@@429 () T@U) -(declare-fun $generated@@430 () T@U) -(declare-fun $generated@@431 (T@U) Bool) -(declare-fun $generated@@432 () T@U) (set-option :timeout 0) (set-option :rlimit 0) (set-option :auto_config false) @@ -1895,19 +1889,19 @@ $generated@@298))))))))) (set-option :pp.bv_literals false) (set-option :smt.arith.solver 2) (assert (not - (=> (= (ControlFlow 0 0) 14) (let (($generated@@433 true)) -(let (($generated@@434 (=> (and (= ($generated@@32 $generated@@33 $generated@@81) $generated@@81) (= (ControlFlow 0 8) (- 0 7))) false))) -(let (($generated@@435 (=> ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false))) (and (=> (= (ControlFlow 0 10) 8) $generated@@434) (=> (= (ControlFlow 0 10) 9) $generated@@433))))) -(let (($generated@@436 true)) -(let (($generated@@437 (=> (and (not ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) (= (ControlFlow 0 6) 4)) $generated@@436))) -(let (($generated@@438 (=> (and (and ($generated@@44 $generated@@422 $generated@@423) ($generated@@151 $generated@@422 $generated@@423 $generated@@424)) (= $generated@@425 ($generated@@327 $generated@@93 $generated@@424 $generated@@1 false))) (and (=> (= (ControlFlow 0 11) 10) $generated@@435) (=> (= (ControlFlow 0 11) 6) $generated@@437))))) -(let (($generated@@439 (=> (and (not (and ($generated@@44 $generated@@422 $generated@@423) ($generated@@151 $generated@@422 $generated@@423 $generated@@424))) (= (ControlFlow 0 5) 4)) $generated@@436))) -(let (($generated@@440 (=> (and ($generated@@34 $generated@@424) (or (= $generated@@426 $generated@@424) ($generated@@103 $generated@@426 $generated@@424))) (and (=> (= (ControlFlow 0 12) 11) $generated@@438) (=> (= (ControlFlow 0 12) 5) $generated@@439))))) -(let (($generated@@441 (=> (and (and ($generated@@35 $generated@@423 $generated@@427 ($generated@@32 $generated@@33 ($generated@@126 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@325) ($generated@@32 $generated@@47 ($generated@@141 $generated@@47 ($generated@@218 ($generated@@173 ($generated@@413 $generated@@428) ($generated@@417 $generated@@423 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@409 ($generated@@138 ($generated@@215 false))))) ($generated@@311 $generated@@429)))))) (= (ControlFlow 0 3) (- 0 2))) ($generated@@35 $generated@@423 $generated@@427 ($generated@@32 $generated@@33 ($generated@@126 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@325) ($generated@@32 $generated@@47 ($generated@@141 $generated@@47 ($generated@@218 ($generated@@173 ($generated@@413 $generated@@428) ($generated@@417 $generated@@423 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@409 ($generated@@138 ($generated@@215 false))))) ($generated@@311 $generated@@429))))))) ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 ($generated@@31 $generated@@423 $generated@@427 ($generated@@32 $generated@@33 ($generated@@126 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@325) ($generated@@32 $generated@@47 ($generated@@141 $generated@@47 ($generated@@218 ($generated@@173 ($generated@@413 $generated@@428) ($generated@@417 $generated@@423 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@409 ($generated@@138 ($generated@@215 false))))) ($generated@@311 $generated@@429)))))))))))) -(let (($generated@@442 true)) -(let (($generated@@443 (=> (= $generated@@430 ($generated@@327 $generated@@93 $generated@@426 $generated@@1 false)) (and (and (=> (= (ControlFlow 0 13) 1) $generated@@442) (=> (= (ControlFlow 0 13) 12) $generated@@440)) (=> (= (ControlFlow 0 13) 3) $generated@@441))))) -(let (($generated@@444 (=> (and (and (and ($generated@@34 $generated@@426) ($generated@@431 $generated@@426)) ($generated@@36 $generated@@33 $generated@@432 ($generated@@37 $generated@@423 $generated@@427))) (and (= 1 $generated@@30) (= (ControlFlow 0 14) 13))) $generated@@443))) -$generated@@444))))))))))))) + (=> (= (ControlFlow 0 0) 14) (let (($generated@@430 true)) +(let (($generated@@431 (=> (and (= ($generated@@32 $generated@@33 $generated@@78) $generated@@78) (= (ControlFlow 0 8) (- 0 7))) false))) +(let (($generated@@432 (=> ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false))) (and (=> (= (ControlFlow 0 10) 8) $generated@@431) (=> (= (ControlFlow 0 10) 9) $generated@@430))))) +(let (($generated@@433 true)) +(let (($generated@@434 (=> (and (not ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) (= (ControlFlow 0 6) 4)) $generated@@433))) +(let (($generated@@435 (=> (and (and ($generated@@44 $generated@@419 $generated@@420) ($generated@@148 $generated@@419 $generated@@420 $generated@@421)) (= $generated@@422 ($generated@@324 $generated@@90 $generated@@421 $generated@@1 false))) (and (=> (= (ControlFlow 0 11) 10) $generated@@432) (=> (= (ControlFlow 0 11) 6) $generated@@434))))) +(let (($generated@@436 (=> (and (not (and ($generated@@44 $generated@@419 $generated@@420) ($generated@@148 $generated@@419 $generated@@420 $generated@@421))) (= (ControlFlow 0 5) 4)) $generated@@433))) +(let (($generated@@437 (=> (and ($generated@@34 $generated@@421) (or (= $generated@@423 $generated@@421) ($generated@@100 $generated@@423 $generated@@421))) (and (=> (= (ControlFlow 0 12) 11) $generated@@435) (=> (= (ControlFlow 0 12) 5) $generated@@436))))) +(let (($generated@@438 (=> (and (and ($generated@@35 $generated@@420 $generated@@424 ($generated@@32 $generated@@33 ($generated@@123 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@322) ($generated@@32 $generated@@47 ($generated@@138 $generated@@47 ($generated@@215 ($generated@@170 ($generated@@410 $generated@@425) ($generated@@414 $generated@@420 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@406 ($generated@@135 ($generated@@212 false))))) ($generated@@308 $generated@@426)))))) (= (ControlFlow 0 3) (- 0 2))) ($generated@@35 $generated@@420 $generated@@424 ($generated@@32 $generated@@33 ($generated@@123 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@322) ($generated@@32 $generated@@47 ($generated@@138 $generated@@47 ($generated@@215 ($generated@@170 ($generated@@410 $generated@@425) ($generated@@414 $generated@@420 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@406 ($generated@@135 ($generated@@212 false))))) ($generated@@308 $generated@@426))))))) ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 ($generated@@31 $generated@@420 $generated@@424 ($generated@@32 $generated@@33 ($generated@@123 ($generated@@32 ($generated@@46 $generated@@42 $generated@@15) $generated@@322) ($generated@@32 $generated@@47 ($generated@@138 $generated@@47 ($generated@@215 ($generated@@170 ($generated@@410 $generated@@425) ($generated@@414 $generated@@420 ($generated@@19 ($generated@@32 $generated@@15 ($generated@@18 false)))) ($generated@@406 ($generated@@135 ($generated@@212 false))))) ($generated@@308 $generated@@426)))))))))))) +(let (($generated@@439 true)) +(let (($generated@@440 (=> (= $generated@@427 ($generated@@324 $generated@@90 $generated@@423 $generated@@1 false)) (and (and (=> (= (ControlFlow 0 13) 1) $generated@@439) (=> (= (ControlFlow 0 13) 12) $generated@@437)) (=> (= (ControlFlow 0 13) 3) $generated@@438))))) +(let (($generated@@441 (=> (and (and (and ($generated@@34 $generated@@423) ($generated@@428 $generated@@423)) ($generated@@36 $generated@@33 $generated@@429 ($generated@@37 $generated@@420 $generated@@424))) (and (= 1 $generated@@30) (= (ControlFlow 0 14) 13))) $generated@@440))) +$generated@@441))))))))))))) )) (check-sat) (get-info :rlimit) diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo index 709beffc9b..787e89f1e6 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-cs.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo index 037628e0ab..c5d9005a6f 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-go.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo index ea8291007c..3aa1708762 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-java.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo index b9ab1eb3ee..0065402198 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-js.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo index d0e5419ff4..5e01c90699 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-notarget.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo index c03206cb12..62006e2faf 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries-py.doo differ diff --git a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo index b42c835e83..3769084ecb 100644 Binary files a/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo and b/Source/DafnyStandardLibraries/binaries/DafnyStandardLibraries.doo differ diff --git a/Source/DafnyStandardLibraries/scripts/check-examples b/Source/DafnyStandardLibraries/scripts/check-examples index ebe308a99e..72f22dc903 100755 --- a/Source/DafnyStandardLibraries/scripts/check-examples +++ b/Source/DafnyStandardLibraries/scripts/check-examples @@ -219,6 +219,7 @@ do ec=2 elif [ "$command" == "%check-resolve-warn" ]; then com=resolve + dOptions="$dOptions --allow-warnings" ec=0 elif [ "$command" == "%check-translate" ]; then com=translate diff --git a/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy b/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy index dd7095061f..eaddebc3a3 100644 --- a/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy +++ b/Source/DafnyStandardLibraries/src/Std/Collections/Seq.dfy @@ -666,7 +666,7 @@ module Std.Collections.Seq { Some((s[..i], s[(i + 1)..])) } - lemma WillSplitOnDelim(s: seq, delim: T, prefix: seq) + lemma {:rlimit 1000} {:vcs_split_on_every_assert} WillSplitOnDelim(s: seq, delim: T, prefix: seq) requires |prefix| < |s| requires forall i :: 0 <= i < |prefix| ==> prefix[i] == s[i] requires delim !in prefix && s[|prefix|] == delim diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/VSComp2010/Problem2-Invert.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/VSComp2010/Problem2-Invert.dfy index a7aed1b457..0400e868a1 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/VSComp2010/Problem2-Invert.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/VSComp2010/Problem2-Invert.dfy @@ -49,19 +49,20 @@ ghost function inImage(i: int): bool { true } // this function is used to trigg method Main() { var a := new int[] [9, 3, 8, 2, 7, 4, 0, 1, 5, 6]; - assert a[0] == 9; - assert a[1] == 3; - assert a[2] == 8; - assert a[3] == 2; - assert a[4] == 7; - assert a[5] == 4; - assert a[6] == 0; - assert a[7] == 1; - assert a[8] == 5; - assert a[9] == 6; - var b := new int[10]; + assert forall m :: 0 <= m < 10 && inImage(m) ==> exists k :: 0 <= k < 10 && a[k] == m by { + assert a[0] == 9; + assert a[1] == 3; + assert a[2] == 8; + assert a[3] == 2; + assert a[4] == 7; + assert a[5] == 4; + assert a[6] == 0; + assert a[7] == 1; + assert a[8] == 5; + assert a[9] == 6; + } M(10, a, b); print "a: ", a[..], "\n"; print "b: ", b[..], "\n"; diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy index 933fbd2186..b269a96758 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy @@ -1,6 +1,6 @@ -// RUN: %testDafnyForEachResolver "%s" -- --allow-axioms=false +// RUN: ! %testDafnyForEachResolver "%s" -- --allow-axioms=false // NONUNIFORM: warning will be the same for all back-end -// RUN: %verify --standard-libraries --allow-axioms:false "%s" > "%t" +// RUN: ! %verify --standard-libraries --allow-axioms:false "%s" &> "%t" // RUN: %diff "%s.expect" "%t" method Foo() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy.expect index 2ec7eb2f42..f144db9d00 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/assume.dfy.expect @@ -3,3 +3,4 @@ assume.dfy(11,10): Warning: assume keyword in assign-such-that statement has no assume.dfy(13,11): Warning: assume keyword in update-with-failure statement has no {:axiom} annotation Dafny program verifier finished with 2 verified, 0 errors +Compilation failed because warnings were found and --allow-warnings is false diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy index 75137a203d..e075afe77b 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy @@ -1,6 +1,6 @@ -// RUN: %verify --allow-axioms:false --type-system-refresh "%s" > "%t" +// RUN: ! %verify --allow-axioms:false --type-system-refresh "%s" &> "%t" // NONUNIFORM: warning will be the same for all back-end -// RUN: ! %run --allow-axioms:false "%s" >> "%t" +// RUN: ! %run --allow-axioms:false "%s" &>> "%t" // RUN: %diff "%s.expect" "%t" diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy.expect index 043d0e4174..f42d7c9281 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/function.dfy.expect @@ -4,6 +4,7 @@ function.dfy(8,36): Warning: This ensures clause is part of a bodyless function. function.dfy(8,50): Warning: This ensures clause is part of a bodyless function. Add the {:axiom} attribute to it or the enclosing function to suppress this warning Dafny program verifier finished with 9 verified, 0 errors +Compilation failed because warnings were found and --allow-warnings is false function.dfy(7,33): Warning: This ensures clause is part of a bodyless function. Add the {:axiom} attribute to it or the enclosing function to suppress this warning function.dfy(7,47): Warning: This ensures clause is part of a bodyless function. Add the {:axiom} attribute to it or the enclosing function to suppress this warning function.dfy(8,36): Warning: This ensures clause is part of a bodyless function. Add the {:axiom} attribute to it or the enclosing function to suppress this warning diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/method.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/method.dfy index bebce60ecc..d944cbeaee 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/method.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/ast/method.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --allow-axioms:false --type-system-refresh "%s" > "%t" +// RUN: %verify --allow-axioms:false --type-system-refresh --allow-warnings "%s" > "%t" // NONUNIFORM: warning will be the same for all back-ends // RUN: ! %run --allow-axioms:false "%s" >> "%t" // RUN: %diff "%s.expect" "%t" diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy index f8691d186f..187680cf63 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy @@ -1,40 +1,40 @@ // Invalid value gives error and stops compilation -// RUN: ! %resolve --warn-shadowing=true %S/broken/invalidValue.toml 2> "%t" +// RUN: ! %resolve --warn-shadowing=true %S/broken/invalidValue.toml &> "%t" // A project file can specify input files and configure options -// RUN: %resolve "%S/dfyconfig.toml" >> "%t" +// RUN: ! %resolve "%S/dfyconfig.toml" &>> "%t" // Test using a URL instead of a local file as a project file -// RUN: ! %resolve "https://github.com/dafny-lang/dafny/blob/master/web.toml" 2>> %t +// RUN: ! %resolve "https://github.com/dafny-lang/dafny/blob/master/web.toml" &>> %t // Test option override behavior -// RUN: %resolve "%S/dfyconfig.toml" --warn-shadowing=false >> "%t" +// RUN: %resolve "%S/dfyconfig.toml" --warn-shadowing=false &>> "%t" // Test option with default override behavior -// RUN: ! %resolve "%S/dfyconfig.toml" --function-syntax=3 >> "%t" +// RUN: ! %resolve "%S/dfyconfig.toml" --function-syntax=3 &>> "%t" // Multiple project files are not allowed -// RUN: ! %resolve "%S/dfyconfig.toml" "%S/broken/dfyconfig.toml" 2>> %t +// RUN: ! %resolve "%S/dfyconfig.toml" "%S/broken/dfyconfig.toml" &>> %t // Project files may not contain unknown properties -// RUN: ! %resolve "%S/broken/dfyconfig.toml" 2>> %t +// RUN: ! %resolve "%S/broken/dfyconfig.toml" &>> %t // Warn if file contains options that don't exist -// RUN: %resolve "%S/broken/invalidOption.toml" >> "%t" +// RUN: ! %resolve "%S/broken/invalidOption.toml" &>> "%t" // Project files must be files on disk. -// RUN: ! %resolve "%S/doesNotExist.toml" 2>> %t +// RUN: ! %resolve "%S/doesNotExist.toml" &>> %t // Project file options must have the right type -// RUN: ! %resolve "%S/badTypes/dfyconfig.toml" >> "%t" +// RUN: ! %resolve "%S/badTypes/dfyconfig.toml" &>> "%t" // A project file without includes will take all .dfy files as input -// RUN: %resolve "%S/noIncludes/dfyconfig.toml" >> "%t" +// RUN: ! %resolve "%S/noIncludes/dfyconfig.toml" &>> "%t" // Files included by the project file and on the CLI, duplicate is ignored. -// RUN: %resolve "%S/dfyconfig.toml" "%S/src/input.dfy" >> "%t" +// RUN: ! %resolve "%S/dfyconfig.toml" "%S/src/input.dfy" &>> "%t" // Files excluded by the project file and included on the CLI, are included -// RUN: ! %resolve "%S/dfyconfig.toml" "%S/src/excluded.dfy" >> "%t" +// RUN: ! %resolve "%S/dfyconfig.toml" "%S/src/excluded.dfy" &>> "%t" // RUN: %diff "%s.expect" "%t" diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy.expect index b13b069af3..6a3f7ba985 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cli/projectFile/projectFile.dfy.expect @@ -1,8 +1,8 @@ Error: The Dafny project file invalidValue.toml contains the following errors: (3,14) : error : Unexpected token `NoIncludes` for a value +Warning: only Dafny project files named dfyconfig.toml are recognised by the Dafny IDE. input.dfy(6,8): Warning: Shadowed local-variable name: x - -Dafny program verifier did not attempt verification +Compilation failed because warnings were found and --allow-warnings is false Error: file web.toml not found Dafny program verifier did not attempt verification @@ -14,17 +14,14 @@ Error: The Dafny project file dfyconfig.toml contains the following errors: (1,1 Warning: only Dafny project files named dfyconfig.toml are recognised by the Dafny IDE. Warning: option 'does-not-exist' that was specified in the project file, is not a valid Dafny option. invalidOption.toml(1,0): Warning: only Dafny project files named dfyconfig.toml are recognised by the Dafny IDE. - -Dafny program verifier did not attempt verification +Compilation failed because warnings were found and --allow-warnings is false Error: file doesNotExist.toml not found dfyconfig.toml(1,0): Error: could not parse value '3' for option 'warn-shadowing' that has type 'Boolean' input.dfy(6,8): Warning: Shadowed local-variable name: x moreInput.dfy(6,8): Warning: Shadowed local-variable name: x - -Dafny program verifier did not attempt verification +Compilation failed because warnings were found and --allow-warnings is false input.dfy(6,8): Warning: Shadowed local-variable name: x - -Dafny program verifier did not attempt verification +Compilation failed because warnings were found and --allow-warnings is false excluded.dfy(3,7): Error: Duplicate member name: Foo input.dfy(6,8): Warning: Shadowed local-variable name: x excluded.dfy(6,8): Warning: Shadowed local-variable name: z diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy index 499b64b33b..5511b29226 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --manual-triggers "%s" > "%t" +// RUN: %verify --manual-triggers --allow-deprecation "%s" > "%t" // RUN: %diff "%s.expect" "%t" // This module proves the correctness of the algorithms. It leaves a number of things undefined. @@ -959,7 +959,7 @@ abstract module M0 { ensures p.fst == pC.fst ensures StateCorrespondence(p.snd, pC.snd) { - assume |args| == Arity(primExec) ==> + assume {:axiom} |args| == Arity(primExec) ==> ValidArgs(primExec, args, stCombined) == ValidArgs(primExec, args, stCombinedC); // TODO: This will require some work! if |args| == Arity(primExec) && ValidArgs(primExec, args, stCombined) { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy.expect index 3216b1d7c7..a4d7ffedb3 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-CachedBuilds.dfy.expect @@ -1,6 +1,2 @@ -CloudMake-CachedBuilds.dfy(107,6): Warning: a forall statement with no bound variables is deprecated; use an 'assert by' statement instead -CloudMake-CachedBuilds.dfy(447,4): Warning: a forall statement with no bound variables is deprecated; use an 'assert by' statement instead -CloudMake-CachedBuilds.dfy(1249,8): Warning: a forall statement with no bound variables is deprecated; use an 'assert by' statement instead -CloudMake-CachedBuilds.dfy(962,4): Warning: assume statement has no {:axiom} annotation Dafny program verifier finished with 76 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy index 0dd0d35942..90eb085b47 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --relax-definite-assignment --manual-triggers "%s" > "%t" +// RUN: %verify --relax-definite-assignment --manual-triggers --allow-deprecation "%s" > "%t" // RUN: %diff "%s.expect" "%t" // This module proves the correctness of the algorithms. It leaves a number of things undefined. diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy.expect index 3cebd6e69a..f397c7f338 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/cloudmake/CloudMake-ParallelBuilds.dfy.expect @@ -1,3 +1,2 @@ -CloudMake-ParallelBuilds.dfy(562,6): Warning: a forall statement with no bound variables is deprecated; use an 'assert by' statement instead Dafny program verifier finished with 101 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Array.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Array.dfy.expect index 8e5a642946..5f3db8228c 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Array.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Array.dfy.expect @@ -9,12 +9,12 @@ Array.dfy(50,19): Error: assertion might not hold Array.dfy(58,7): Error: assignment might update an array element not in the enclosing context's modifies clause Array.dfy(65,7): Error: assignment might update an array element not in the enclosing context's modifies clause Array.dfy(108,20): Error: upper bound below lower bound or above length of array -Array.dfy(118,7): Error: insufficient reads clause to read the indicated range of array elements -Array.dfy(120,7): Error: insufficient reads clause to read the indicated range of array elements -Array.dfy(121,7): Error: insufficient reads clause to read the indicated range of array elements -Array.dfy(122,7): Error: insufficient reads clause to read the indicated range of array elements -Array.dfy(160,5): Error: insufficient reads clause to read array element -Array.dfy(168,5): Error: insufficient reads clause to read array element +Array.dfy(118,7): Error: insufficient reads clause to read the indicated range of array elements; Consider adding 'reads a' in the enclosing function specification for resolution +Array.dfy(120,7): Error: insufficient reads clause to read the indicated range of array elements; Consider adding 'reads a' in the enclosing function specification for resolution +Array.dfy(121,7): Error: insufficient reads clause to read the indicated range of array elements; Consider adding 'reads a' in the enclosing function specification for resolution +Array.dfy(122,7): Error: insufficient reads clause to read the indicated range of array elements; Consider adding 'reads a' in the enclosing function specification for resolution +Array.dfy(160,5): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing function specification for resolution +Array.dfy(168,5): Error: insufficient reads clause to read array element; Consider adding 'reads b' in the enclosing function specification for resolution Array.dfy(184,5): Error: assignment might update an array element not in the enclosing context's modifies clause Array.dfy(191,5): Error: assignment might update an array element not in the enclosing context's modifies clause Array.dfy(216,0): Error: a postcondition could not be proved on this return path diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Comprehensions.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Comprehensions.dfy.expect index 5a5ad58161..35d8b095ab 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Comprehensions.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Comprehensions.dfy.expect @@ -8,7 +8,7 @@ Comprehensions.dfy(12,13): Error: assertion might not hold Comprehensions.dfy(78,22): Error: assertion might not hold Comprehensions.dfy(99,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor Comprehensions.dfy(107,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor -Comprehensions.dfy(115,40): Error: insufficient reads clause to read field +Comprehensions.dfy(115,40): Error: insufficient reads clause to read field; Consider extracting x to a local variable before the lambda expression, or adding 'reads this' in the enclosing lambda specification for resolution Comprehensions.dfy(118,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor Comprehensions.dfy(126,4): Error: all sequence indices must be in the domain of the initialization function Comprehensions.dfy(132,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ComprehensionsNewSyntax.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ComprehensionsNewSyntax.dfy.expect index bc8699851c..6b0a32f79f 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ComprehensionsNewSyntax.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ComprehensionsNewSyntax.dfy.expect @@ -8,7 +8,7 @@ ComprehensionsNewSyntax.dfy(12,13): Error: assertion might not hold ComprehensionsNewSyntax.dfy(78,22): Error: assertion might not hold ComprehensionsNewSyntax.dfy(99,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor ComprehensionsNewSyntax.dfy(107,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor -ComprehensionsNewSyntax.dfy(115,40): Error: insufficient reads clause to read field +ComprehensionsNewSyntax.dfy(115,40): Error: insufficient reads clause to read field; Consider extracting x to a local variable before the lambda expression, or adding 'reads this' in the enclosing lambda specification for resolution ComprehensionsNewSyntax.dfy(118,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor ComprehensionsNewSyntax.dfy(126,4): Error: all sequence indices must be in the domain of the initialization function ComprehensionsNewSyntax.dfy(132,4): Error: insufficient reads clause to invoke the function passed as an argument to the sequence constructor diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DefaultParameters.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DefaultParameters.dfy.expect index ca00b3beab..374679dc3f 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DefaultParameters.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DefaultParameters.dfy.expect @@ -5,8 +5,8 @@ DefaultParameters.dfy(92,2): Error: a postcondition could not be proved on this DefaultParameters.dfy(91,16): Related location: this is the postcondition that could not be proved DefaultParameters.dfy(102,15): Error: assertion might not hold DefaultParameters.dfy(110,15): Error: assertion might not hold -DefaultParameters.dfy(124,37): Error: insufficient reads clause to read field -DefaultParameters.dfy(131,40): Error: insufficient reads clause to read field +DefaultParameters.dfy(124,37): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls +DefaultParameters.dfy(131,40): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls DefaultParameters.dfy(135,49): Error: possible division by zero DefaultParameters.dfy(137,43): Error: possible division by zero DefaultParameters.dfy(140,34): Error: possible division by zero @@ -38,13 +38,13 @@ DefaultParameters.dfy(229,8): Error: decreases clause might not decrease DefaultParameters.dfy(235,4): Error: decreases clause might not decrease DefaultParameters.dfy(235,6): Error: decreases clause might not decrease DefaultParameters.dfy(241,4): Error: decreases clause might not decrease -DefaultParameters.dfy(251,31): Error: insufficient reads clause to read field +DefaultParameters.dfy(251,31): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls DefaultParameters.dfy(258,40): Error: default-value expression is not allowed to involve recursive or mutually recursive calls DefaultParameters.dfy(267,41): Error: possible division by zero DefaultParameters.dfy(320,45): Error: a precondition for this call could not be proved DefaultParameters.dfy(319,15): Related location: this is the precondition that could not be proved -DefaultParameters.dfy(326,36): Error: insufficient reads clause to read array element -DefaultParameters.dfy(327,54): Error: insufficient reads clause to read array element +DefaultParameters.dfy(326,36): Error: insufficient reads clause to read array element; Array elements cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls +DefaultParameters.dfy(327,54): Error: insufficient reads clause to read array element; Array elements cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls DefaultParameters.dfy(360,38): Error: possible division by zero DefaultParameters.dfy(361,40): Error: possible division by zero DefaultParameters.dfy(362,32): Error: possible division by zero @@ -70,10 +70,10 @@ DefaultParameters.dfy(493,18): Error: value does not satisfy the subset constrai DefaultParameters.dfy(494,32): Error: value does not satisfy the subset constraints of 'nat' DefaultParameters.dfy(500,15): Error: a precondition for this call could not be proved DefaultParameters.dfy(503,13): Related location: this is the precondition that could not be proved -DefaultParameters.dfy(520,38): Error: insufficient reads clause to read field -DefaultParameters.dfy(521,40): Error: insufficient reads clause to read field -DefaultParameters.dfy(524,49): Error: insufficient reads clause to read field -DefaultParameters.dfy(548,38): Error: insufficient reads clause to read field +DefaultParameters.dfy(520,38): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls +DefaultParameters.dfy(521,40): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls +DefaultParameters.dfy(524,49): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls +DefaultParameters.dfy(548,38): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls DefaultParameters.dfy(601,11): Error: assertion might not hold DefaultParameters.dfy(582,18): Related location: this proposition could not be proved diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DirtyLoops.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DirtyLoops.dfy index f96f581064..ecb6919530 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DirtyLoops.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/DirtyLoops.dfy @@ -1,5 +1,5 @@ // RUN: %exits-with 4 %verify --relax-definite-assignment --print:"%t.dprint.dfy" "%s" > "%t" -// RUN: %resolve "%t.dprint.dfy" >> "%t" +// RUN: %resolve "%t.dprint.dfy" --allow-warnings >> "%t" // RUN: %diff "%s.expect" "%t" // For a body-less loop specification, a local variable or diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Fuel.legacy.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Fuel.legacy.dfy.expect index 0844ff7edf..cedc561422 100755 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Fuel.legacy.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Fuel.legacy.dfy.expect @@ -21,19 +21,19 @@ Fuel.legacy.dfy(324,21): Related location Fuel.legacy.dfy(313,41): Related location Fuel.legacy.dfy(335,26): Error: function precondition could not be proved Fuel.legacy.dfy(324,21): Related location -Fuel.legacy.dfy(312,43): Related location +Fuel.legacy.dfy(314,72): Related location Fuel.legacy.dfy(335,26): Error: function precondition could not be proved Fuel.legacy.dfy(324,21): Related location -Fuel.legacy.dfy(312,58): Related location +Fuel.legacy.dfy(314,93): Related location Fuel.legacy.dfy(335,26): Error: function precondition could not be proved Fuel.legacy.dfy(324,21): Related location Fuel.legacy.dfy(314,46): Related location Fuel.legacy.dfy(335,26): Error: function precondition could not be proved Fuel.legacy.dfy(324,21): Related location -Fuel.legacy.dfy(314,72): Related location +Fuel.legacy.dfy(312,43): Related location Fuel.legacy.dfy(335,26): Error: function precondition could not be proved Fuel.legacy.dfy(324,21): Related location -Fuel.legacy.dfy(314,93): Related location +Fuel.legacy.dfy(312,58): Related location Fuel.legacy.dfy(335,49): Error: destructor 't' can only be applied to datatype values constructed by 'VTuple' Fuel.legacy.dfy(335,50): Error: index out of range Fuel.legacy.dfy(336,38): Error: index out of range @@ -43,19 +43,19 @@ Fuel.legacy.dfy(329,21): Related location Fuel.legacy.dfy(311,43): Related location Fuel.legacy.dfy(336,45): Error: function precondition could not be proved Fuel.legacy.dfy(329,21): Related location -Fuel.legacy.dfy(314,72): Related location +Fuel.legacy.dfy(312,43): Related location Fuel.legacy.dfy(336,45): Error: function precondition could not be proved Fuel.legacy.dfy(329,21): Related location -Fuel.legacy.dfy(314,93): Related location +Fuel.legacy.dfy(314,72): Related location Fuel.legacy.dfy(336,45): Error: function precondition could not be proved Fuel.legacy.dfy(329,21): Related location -Fuel.legacy.dfy(312,58): Related location +Fuel.legacy.dfy(314,93): Related location Fuel.legacy.dfy(336,45): Error: function precondition could not be proved Fuel.legacy.dfy(329,21): Related location Fuel.legacy.dfy(313,41): Related location Fuel.legacy.dfy(336,45): Error: function precondition could not be proved Fuel.legacy.dfy(329,21): Related location -Fuel.legacy.dfy(312,43): Related location +Fuel.legacy.dfy(312,58): Related location Fuel.legacy.dfy(336,71): Error: index out of range Fuel.legacy.dfy(397,22): Error: assertion might not hold Fuel.legacy.dfy(398,22): Error: assertion might not hold diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy index fced236863..ccb837a7d6 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy @@ -35,9 +35,9 @@ ghost method m1() { assert s2 - s3 == iset{3}; // set difference assert (iset x | x in s2 :: x+1) == iset{2,3,4}; // set comprehension - assert 17 in (iset x: int | true :: x); // set comprehension + assert 17 in (iset x: int {:trigger} | true :: x); // set comprehension - assert (imap x: int | true :: x+1)[14] == 15; + assert (imap x: int {:trigger} | true :: x+1)[14] == 15; } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy.expect index e07c395e63..ebe2328e07 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ISets.dfy.expect @@ -1,4 +1,2 @@ -ISets.dfy(38,15): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -ISets.dfy(40,9): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Dafny program verifier finished with 2 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/JustWarnings.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/JustWarnings.dfy index a6d4239363..c3380be4cf 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/JustWarnings.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/JustWarnings.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" -- --warn-shadowing +// RUN: %testDafnyForEachResolver "%s" -- --warn-shadowing --allow-warnings // This file tests the behavior where the Resolver reports some warnings diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/PrecedenceLinter.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/PrecedenceLinter.dfy index df4a205848..5eb498de61 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/PrecedenceLinter.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/PrecedenceLinter.dfy @@ -1,4 +1,4 @@ -// RUN: %resolve "%s" > "%t" +// RUN: %resolve "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" ghost predicate P0(A: bool, B: bool, C: bool) { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Reads.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Reads.dfy.expect index bd68ad7987..f23fdc0822 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Reads.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Reads.dfy.expect @@ -1,14 +1,14 @@ -Reads.dfy(9,16): Error: insufficient reads clause to read field -Reads.dfy(18,29): Error: insufficient reads clause to read field -Reads.dfy(28,32): Error: insufficient reads clause to read field -Reads.dfy(37,29): Error: insufficient reads clause to read field -Reads.dfy(56,29): Error: insufficient reads clause to read field +Reads.dfy(9,16): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing function specification for resolution +Reads.dfy(18,29): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing function specification for resolution +Reads.dfy(28,32): Error: insufficient reads clause to read field; Consider adding 'reads xs[0]' or 'reads xs[0]`u' in the enclosing function specification for resolution +Reads.dfy(37,29): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing function specification for resolution +Reads.dfy(56,29): Error: insufficient reads clause to read field; Consider adding 'reads r' or 'reads r`r' in the enclosing function specification for resolution Reads.dfy(122,35): Error: function precondition could not be proved Reads.dfy(122,35): Error: insufficient reads clause to invoke function Reads.dfy(125,37): Error: insufficient reads clause to invoke function -Reads.dfy(138,10): Error: insufficient reads clause to read field -Reads.dfy(149,25): Error: insufficient reads clause to read field -Reads.dfy(157,18): Error: insufficient reads clause to read field +Reads.dfy(138,10): Error: insufficient reads clause to read field; Consider adding 'reads this' or 'reads this`Repr' in the enclosing predicate specification for resolution +Reads.dfy(149,25): Error: insufficient reads clause to read field; Consider adding 'reads this' or 'reads this`y' in the enclosing function specification for resolution +Reads.dfy(157,18): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls Reads.dfy(159,18): Error: insufficient reads clause to invoke function Dafny program verifier finished with 19 verified, 12 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy index ac47a4114e..31dec74585 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy @@ -242,7 +242,7 @@ method GetBoxReadsStar(b: Box) returns (i: int) method GetBoxIncorrectReads(b: Box) returns (i: int) reads {} { - i := b.x; // Error: insufficient reads clause to read field + i := b.x; // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants } method GetBoxDefaultReads(b: Box) returns (i: int) @@ -301,7 +301,7 @@ class {:extern} ExternalSequentialMutableMap { } method {:concurrent} MemoizedSquare2(x: int, cache: ExternalSequentialMutableMap) returns (xSquared: int) - requires forall k | k in cache.state :: cache.state[k] == k * k // Error: insufficient reads clause to read field + requires forall k | k in cache.state :: cache.state[k] == k * k // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants reads {} ensures xSquared == x * x { @@ -399,7 +399,7 @@ function WeirdAlways42(b: Box): int { 42 } by method { var result := 42; - result := result + b.x; // Error: insufficient reads clause to read field + result := result + b.x; // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants result := result - b.x; return 42; } @@ -408,9 +408,9 @@ function WeirdAlways42(b: Box): int { method BadMetaBox(b: Box>) reads {} - modifies b.x // Error: insufficient reads clause to read field + modifies b.x // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants { - b.x.x := 42; // Error: insufficient reads clause to read field + b.x.x := 42; // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants } method GoodMetaBox(b: Box>) @@ -520,14 +520,14 @@ twostate predicate Was42(b: Box) { // Testing the reads checks on other clauses method OnlySpecReads(b: Box) returns (r: int) - requires b.x == 42 // Error: insufficient reads clause to read field + requires b.x == 42 // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants reads {} ensures r == b.x { return 42; } -method DefaultValueReads(b: Box, x: int := b.x) // Error: insufficient reads clause to read field +method DefaultValueReads(b: Box, x: int := b.x) // Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values or the right-hand side of constants returns (r: int) reads {} { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy.expect index 54fb063da8..e41ecaaa55 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ReadsOnMethods.dfy.expect @@ -1,28 +1,28 @@ ReadsOnMethods.dfy(279,8): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. ReadsOnMethods.dfy(280,11): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -ReadsOnMethods.dfy(19,16): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(29,29): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(44,32): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(54,29): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(73,29): Error: insufficient reads clause to read field +ReadsOnMethods.dfy(19,16): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing method specification for resolution +ReadsOnMethods.dfy(29,29): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing method specification for resolution +ReadsOnMethods.dfy(44,32): Error: insufficient reads clause to read field; Consider adding 'reads xs[0]' or 'reads xs[0]`u' in the enclosing method specification for resolution +ReadsOnMethods.dfy(54,29): Error: insufficient reads clause to read field; Consider adding 'reads c' or 'reads c`u' in the enclosing method specification for resolution +ReadsOnMethods.dfy(73,29): Error: insufficient reads clause to read field; Consider adding 'reads r' or 'reads r`r' in the enclosing method specification for resolution ReadsOnMethods.dfy(147,35): Error: function precondition could not be proved ReadsOnMethods.dfy(147,35): Error: insufficient reads clause to invoke function ReadsOnMethods.dfy(151,37): Error: insufficient reads clause to invoke function ReadsOnMethods.dfy(162,25): Error: insufficient reads clause to invoke function ReadsOnMethods.dfy(162,43): Error: insufficient reads clause to invoke function -ReadsOnMethods.dfy(169,10): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(172,19): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(183,25): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(245,9): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(304,33): Error: insufficient reads clause to read field +ReadsOnMethods.dfy(169,10): Error: insufficient reads clause to read field; Consider adding 'reads this' or 'reads this`Repr' in the enclosing method specification for resolution +ReadsOnMethods.dfy(172,19): Error: insufficient reads clause to read field; Consider adding 'reads this' or 'reads this`Repr' in the enclosing method specification for resolution +ReadsOnMethods.dfy(183,25): Error: insufficient reads clause to read field; Consider adding 'reads this' or 'reads this`y' in the enclosing method specification for resolution +ReadsOnMethods.dfy(245,9): Error: insufficient reads clause to read field; Consider adding 'reads b' or 'reads b`x' in the enclosing method specification for resolution +ReadsOnMethods.dfy(304,33): Error: insufficient reads clause to read field; Consider adding 'reads cache' or 'reads cache`state' in the enclosing method specification for resolution ReadsOnMethods.dfy(308,22): Error: insufficient reads clause to invoke function ReadsOnMethods.dfy(313,13): Error: insufficient reads clause to call ReadsOnMethods.dfy(360,20): Error: insufficient reads clause to call -ReadsOnMethods.dfy(402,23): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(411,13): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(413,4): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(427,10): Error: insufficient reads clause to read array element -ReadsOnMethods.dfy(436,10): Error: insufficient reads clause to read array element +ReadsOnMethods.dfy(402,23): Error: insufficient reads clause to read field; Consider adding 'reads b' or 'reads b`x' in the enclosing function specification for resolution +ReadsOnMethods.dfy(411,13): Error: insufficient reads clause to read field; Consider adding 'reads b' or 'reads b`x' in the enclosing method specification for resolution +ReadsOnMethods.dfy(413,4): Error: insufficient reads clause to read field; Consider adding 'reads b' or 'reads b`x' in the enclosing method specification for resolution +ReadsOnMethods.dfy(427,10): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing method specification for resolution +ReadsOnMethods.dfy(436,10): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing method specification for resolution ReadsOnMethods.dfy(469,2): Error: method might read an object not in the parent trait context's reads clause ReadsOnMethods.dfy(479,26): Error: insufficient reads clause to call ReadsOnMethods.dfy(484,24): Error: insufficient reads clause to call @@ -30,7 +30,7 @@ ReadsOnMethods.dfy(494,35): Error: insufficient reads clause to call ReadsOnMethods.dfy(499,9): Error: insufficient reads clause to invoke function ReadsOnMethods.dfy(505,9): Error: assertion might not hold ReadsOnMethods.dfy(516,11): Related location: this proposition could not be proved -ReadsOnMethods.dfy(523,13): Error: insufficient reads clause to read field -ReadsOnMethods.dfy(530,50): Error: insufficient reads clause to read field +ReadsOnMethods.dfy(523,13): Error: insufficient reads clause to read field; Consider adding 'reads b' or 'reads b`x' in the enclosing method specification for resolution +ReadsOnMethods.dfy(530,50): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls Dafny program verifier finished with 67 verified, 31 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ResolutionErrors7.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ResolutionErrors7.dfy.expect index 57df6fce06..1626ac4890 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ResolutionErrors7.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/ResolutionErrors7.dfy.expect @@ -37,6 +37,8 @@ ResolutionErrors7.dfy(183,13): Error: == can only be applied to expressions of t ResolutionErrors7.dfy(188,13): Error: == can only be applied to expressions of types that support equality (got T) (perhaps try declaring type parameter 'T' on line 182 as 'T(==)', which says it can only be instantiated with a type that supports equality) ResolutionErrors7.dfy(190,23): Error: == can only be applied to expressions of types that support equality (got T) (perhaps try declaring type parameter 'T' on line 182 as 'T(==)', which says it can only be instantiated with a type that supports equality) ResolutionErrors7.dfy(192,14): Error: type parameter 0 (T) passed to type QuadEq must support equality (got seq) +ResolutionErrors7.dfy(192,14): Error: type parameter 0 (T) passed to type QuadEq must support equality (got seq) +ResolutionErrors7.dfy(193,15): Error: type parameter 1 (U) passed to type QuadEq must support equality (got seq) ResolutionErrors7.dfy(193,15): Error: type parameter 1 (U) passed to type QuadEq must support equality (got seq) ResolutionErrors7.dfy(202,15): Error: == can only be applied to expressions of types that support equality (got T) (perhaps try declaring type parameter 'T' on line 199 as 'T(==)', which says it can only be instantiated with a type that supports equality) ResolutionErrors7.dfy(211,15): Error: == can only be applied to expressions of types that support equality (got T) (perhaps try declaring type parameter 'T' on line 199 as 'T(==)', which says it can only be instantiated with a type that supports equality) @@ -69,4 +71,4 @@ ResolutionErrors7.dfy(338,6): Error: type parameter (T) passed to function NoRef ResolutionErrors7.dfy(344,9): Error: type parameter (T) passed to function MustBeNonempty must be nonempty (got PossiblyEmpty) ResolutionErrors7.dfy(350,9): Error: type parameter (T) passed to function MustBeAutoInit must support auto-initialization (got PossiblyEmpty) ResolutionErrors7.dfy(365,9): Error: type parameter (T) passed to function NoReferences must contain no references (got Class?) -71 resolution/type errors detected in ResolutionErrors7.dfy +73 resolution/type errors detected in ResolutionErrors7.dfy diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/SmallTests.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/SmallTests.dfy index f7dc8f1792..7402392fd8 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/SmallTests.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/SmallTests.dfy @@ -1,5 +1,5 @@ // RUN: %exits-with 4 %verify --relax-definite-assignment --allow-axioms --allow-deprecation --print "%t.dprint.dfy" "%s" > "%t" -// RUN: %resolve --allow-axioms "%t.dprint.dfy" >> "%t" +// RUN: %resolve --allow-axioms --allow-warnings "%t.dprint.dfy" >> "%t" // RUN: %diff "%s.expect" "%t" class Node { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Stdin.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Stdin.dfy index 74cd0093ad..adb6e49571 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Stdin.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Stdin.dfy @@ -1,6 +1,6 @@ // RUN: %exits-with 0 %stdin "module A{}" %baredafny verify --show-snippets:false --stdin > "%t" // RUN: %exits-with 4 %stdin "method a() { assert false; }" %baredafny verify --show-snippets:false --stdin >> "%t" -// RUN: %exits-with 0 %stdin "" %baredafny verify --show-snippets:false --stdin >> "%t" +// RUN: %exits-with 0 %stdin "" %baredafny verify --allow-warnings --show-snippets:false --stdin >> "%t" // Ensuring include statements work when processing standard in too // (regression test for https://github.com/dafny-lang/dafny/issues/4135) // We don't capture the output to %t because it ends up including paths, diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Twostate-Functions.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Twostate-Functions.dfy.expect index a7aced4924..6f02395a27 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Twostate-Functions.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/Twostate-Functions.dfy.expect @@ -1,6 +1,6 @@ Twostate-Functions.dfy(11,27): Error: receiver could not be proved to be allocated in the state in which its fields are accessed Twostate-Functions.dfy(18,12): Error: receiver could not be proved to be allocated in the state in which its fields are accessed -Twostate-Functions.dfy(23,8): Error: insufficient reads clause to read field +Twostate-Functions.dfy(23,8): Error: insufficient reads clause to read field; Consider adding 'reads u' or 'reads u`aa' in the enclosing twostate function specification for resolution Twostate-Functions.dfy(66,17): Error: assertion might not hold Twostate-Functions.dfy(54,14): Related location: this proposition could not be proved Twostate-Functions.dfy(68,15): Error: assertion might not hold diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/snapshots/Snapshots5.run.legacy.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/snapshots/Snapshots5.run.legacy.dfy.expect index 2c26e09e57..5566f116ad 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/snapshots/Snapshots5.run.legacy.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny0/snapshots/Snapshots5.run.legacy.dfy.expect @@ -2,11 +2,11 @@ Snapshots5.v0.dfy(10,12): Warning: Could not find a trigger for this quantifier. Snapshots5.v0.dfy(13,10): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Snapshots5.v0.dfy(20,12): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Snapshots5.v0.dfy(26,11): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -Processing command (at Snapshots5.v0.dfy(10,40)) assert {:id "id1"} (forall b#1_1: bool :: true ==> b#1_1 || !b#1_1) || 0 != 0; +Processing command (at Snapshots5.v0.dfy(10,40)) assert {:id "id1"} (forall b#1_1: bool :: b#1_1 || !b#1_1) || 0 != 0; >>> DoNothingToAssert -Processing command (at Snapshots5.v0.dfy(13,38)) assert {:id "id3"} (forall b#1: bool :: true ==> b#1 || !b#1) || 3 != 3; +Processing command (at Snapshots5.v0.dfy(13,38)) assert {:id "id3"} (forall b#1: bool :: b#1 || !b#1) || 3 != 3; >>> DoNothingToAssert -Processing command (at Snapshots5.v0.dfy(20,40)) assert {:id "id4"} (forall b#3_1: bool :: true ==> b#3_1 || !b#3_1) || 1 != 1; +Processing command (at Snapshots5.v0.dfy(20,40)) assert {:id "id4"} (forall b#3_1: bool :: b#3_1 || !b#3_1) || 1 != 1; >>> DoNothingToAssert Dafny program verifier finished with 1 verified, 0 errors @@ -15,9 +15,9 @@ Snapshots5.v1.dfy(13,10): Warning: Could not find a trigger for this quantifier. Snapshots5.v1.dfy(20,12): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Snapshots5.v1.dfy(22,10): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Snapshots5.v1.dfy(27,11): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -Processing command (at Snapshots5.v1.dfy(10,40)) assert {:id "id10"} (forall b#1_1: bool :: true ==> b#1_1 || !b#1_1) || 0 != 0; +Processing command (at Snapshots5.v1.dfy(10,40)) assert {:id "id10"} (forall b#1_1: bool :: b#1_1 || !b#1_1) || 0 != 0; >>> MarkAsFullyVerified -Processing command (at Snapshots5.v1.dfy(13,38)) assert {:id "id12"} (forall b#1: bool :: true ==> b#1 || !b#1) || 3 != 3; +Processing command (at Snapshots5.v1.dfy(13,38)) assert {:id "id12"} (forall b#1: bool :: b#1 || !b#1) || 3 != 3; >>> MarkAsFullyVerified Processing command (at Snapshots5.v1.dfy(20,37)) assert {:id "id13"} (exists b#3_1: bool :: Lit(true)) || 4 != 4; >>> DoNothingToAssert diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy index a46373e26c..e5ed5eaa8d 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-deprecation // Schorr-Waite algorithms, written and verified in Dafny. diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy.expect index 4ea2437c20..851aaf5828 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny1/SchorrWaite-stages.dfy.expect @@ -1,23 +1,2 @@ -SchorrWaite-stages.dfy(149,7): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(150,10): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(161,9): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(162,16): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(164,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(168,15): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(174,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(175,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(201,7): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(202,10): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(221,9): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(223,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(225,16): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(230,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(236,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(239,11): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(255,7): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(256,10): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(260,9): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(261,16): Warning: the ... refinement feature in statements is deprecated -SchorrWaite-stages.dfy(263,11): Warning: the ... refinement feature in statements is deprecated Dafny program verifier finished with 7 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy index e0257ba6ec..0f666e6e50 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-deprecation module M0 { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy.expect index f015f6885e..25822a5c6c 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny2/MonotonicHeapstate.dfy.expect @@ -1,7 +1,2 @@ -MonotonicHeapstate.dfy(92,13): Warning: the ... refinement feature in statements is deprecated -MonotonicHeapstate.dfy(99,13): Warning: the ... refinement feature in statements is deprecated -MonotonicHeapstate.dfy(106,13): Warning: the ... refinement feature in statements is deprecated -MonotonicHeapstate.dfy(146,9): Warning: the ... refinement feature in statements is deprecated -MonotonicHeapstate.dfy(147,13): Warning: the ... refinement feature in statements is deprecated Dafny program verifier finished with 24 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy index e94b03b727..0bb116a169 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy @@ -78,7 +78,7 @@ lemma {:induction false} SAppendIsAssociativeK(k:nat, a:Stream, b:Stream, c:Stre lemma SAppendIsAssociative(a:Stream, b:Stream, c:Stream) ensures SAppend(SAppend(a, b), c) == SAppend(a, SAppend(b, c)); { - forall k:nat { SAppendIsAssociativeK(k, a, b, c); } + forall k:nat {:trigger} { SAppendIsAssociativeK(k, a, b, c); } // assert for clarity only, postcondition follows directly from it assert (forall k:nat {:autotriggers false} :: SAppend(SAppend(a, b), c) ==#[k] SAppend(a, SAppend(b, c))); //FIXME: Should Dafny generate a trigger here? If so then which one? } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy.expect index 73aebefff5..e5f9ee5a23 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/InductionVsCoinduction.dfy.expect @@ -1,3 +1,2 @@ -InductionVsCoinduction.dfy(81,2): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Dafny program verifier finished with 12 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy index 2118c9dcc0..0ffe3988ec 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy @@ -62,7 +62,7 @@ greatest lemma Theorem0_Alt(M: Stream) lemma Theorem0_Par(M: Stream) ensures map_fg(M) == map_f(map_g(M)); { - forall k: nat { + forall k: nat {:trigger} { Theorem0_Ind(k, M); } } @@ -102,7 +102,7 @@ greatest lemma Theorem1_Alt(M: Stream, N: Stream) lemma Theorem1_Par(M: Stream, N: Stream) ensures map_f(append(M, N)) == append(map_f(M), map_f(N)); { - forall k: nat { + forall k: nat {:trigger} { Theorem1_Ind(k, M, N); } } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy.expect index a08ea0c11d..9e74af046b 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny3/Streams.dfy.expect @@ -1,4 +1,2 @@ -Streams.dfy(65,2): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -Streams.dfy(105,2): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Dafny program verifier finished with 29 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug121.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug121.dfy index ed12bf3272..914b90ffbf 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug121.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug121.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings method Try (a:int, b:int, c:int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug122.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug122.dfy index 4be16d622d..594b274d52 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug122.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug122.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings method Try (a:int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug142.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug142.dfy index 3224df8431..0796b715c1 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug142.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug142.dfy @@ -1,4 +1,4 @@ -// RUN: %resolve --warn-shadowing "%s" > "%t" +// RUN: %resolve --warn-shadowing --allow-warnings "%s" > "%t" // RUN: %diff "%s.expect" "%t" ghost function P(x:int):int diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug146.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug146.dfy.expect index f6322f25f9..d22e955331 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug146.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Bug146.dfy.expect @@ -1,4 +1,4 @@ -Bug146.dfy(6,75): Error: insufficient reads clause to read array element +Bug146.dfy(6,75): Error: insufficient reads clause to read array element; Consider adding 'reads world' in the enclosing function specification for resolution Bug146.dfy(37,15): Error: assertion might not hold Bug146.dfy(26,4): Related location: this proposition could not be proved diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Regression1.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Regression1.dfy index 34382ea05c..c07347d1bf 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Regression1.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/Regression1.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings ghost method M() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/gcd.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/gcd.dfy index 84220a79ab..1c21414194 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/gcd.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/gcd.dfy @@ -64,7 +64,7 @@ ghost function FindMax(s: set): (max: pos) if x < y then y else x } -ghost function Gcd(x: pos, y: pos): pos { +opaque ghost function Gcd(x: pos, y: pos): pos { var common := Factors(x) * Factors(y); assert 1 in common by { FactorsContains1(x); @@ -73,21 +73,45 @@ ghost function Gcd(x: pos, y: pos): pos { Max(common) } -lemma AboutGcd(x: pos, y: pos) +lemma IsFactorGcdFirst(x: pos, y: pos) ensures IsFactor(Gcd(x, y), x) +{ + reveal Gcd(); +} + +lemma IsFactorGcdSecond(x: pos, y: pos) ensures IsFactor(Gcd(x, y), y) +{ + reveal Gcd(); +} + +lemma IsFactorGcdLess(x: pos, y: pos) ensures forall p: pos :: IsFactor(p, x) && IsFactor(p, y) ==> p <= Gcd(x, y) { + IsFactorGcdFirst(x, y); + IsFactorGcdSecond(x, y); forall p: pos | IsFactor(p, x) && IsFactor(p, y) ensures p <= Gcd(x, y) { + reveal Gcd(); assert p in Factors(x) * Factors(y); } } +lemma AboutGcd(x: pos, y: pos) + ensures IsFactor(Gcd(x, y), x) + ensures IsFactor(Gcd(x, y), y) + ensures forall p: pos :: IsFactor(p, x) && IsFactor(p, y) ==> p <= Gcd(x, y) +{ + IsFactorGcdFirst(x, y); + IsFactorGcdSecond(x, y); + IsFactorGcdLess(x, y); +} + lemma GcdSymmetric(x: pos, y: pos) ensures Gcd(x, y) == Gcd(y, x) { + reveal Gcd(); assert Factors(x) * Factors(y) == Factors(y) * Factors(x); } @@ -95,10 +119,11 @@ lemma GcdIdempotent(x: pos) ensures Gcd(x, x) == x { FactorsContainsSelf(x); + reveal Gcd(); assert x in Factors(x) * Factors(x); } -lemma {:resource_limit "500e6"} GcdSubtract(x: pos, y: pos) +lemma GcdSubtract(x: pos, y: pos) requires x < y ensures Gcd(x, y) == Gcd(x, y - x) { @@ -107,6 +132,7 @@ lemma {:resource_limit "500e6"} GcdSubtract(x: pos, y: pos) // By the definition of `Gcd`, we know that p is a factor of both x and y, // We now show that p is also a factor of y - x. assert IsFactor(p, y - x) by { + reveal Gcd(); var a :| p * a == x; var b :| p * b == y; calc { @@ -120,7 +146,7 @@ lemma {:resource_limit "500e6"} GcdSubtract(x: pos, y: pos) // Hence, p is a common factor of x and y - x var common := Factors(x) * Factors(y - x); - assert p in common; + assert p in common by { reveal Gcd(); } // It remains to show that, among the common factors of x and // y - x, p is the greatest @@ -128,6 +154,7 @@ lemma {:resource_limit "500e6"} GcdSubtract(x: pos, y: pos) ensures q <= p { // q is a factor of both x and y - x, so a and b exist: + reveal Gcd(); var a :| q * a == x; var b :| q * b == y - x; assert IsFactor(q, y) by { @@ -145,6 +172,7 @@ lemma {:resource_limit "500e6"} GcdSubtract(x: pos, y: pos) assert q in Factors(x) * Factors(y); // By the definition of Gcd(x, y), we then have that q <= p. } + assert Gcd(x, y) == Gcd(x, y - x) by { reveal Gcd(); } } method EuclidGcd(X: pos, Y: pos) returns (gcd: pos) @@ -185,6 +213,7 @@ lemma GcdSubtractAlt(x: pos, y: pos) var p := Gcd(x, y); assert IsFactor(p, y - x) by { + reveal Gcd(); var a :| p * a == x; var b :| p * b == y; calc { @@ -197,10 +226,11 @@ lemma GcdSubtractAlt(x: pos, y: pos) } var common := Factors(x) * Factors(y - x); - assert p in common; + assert p in common by { reveal Gcd(); } forall q | q in common ensures q <= p { + reveal Gcd(); var a :| q * a == x; var b :| q * b == y - x; assert IsFactor(q, y) by { @@ -216,6 +246,7 @@ lemma GcdSubtractAlt(x: pos, y: pos) } assert q in Factors(x) * Factors(y); } + assert Gcd(y, x) == Gcd(x, y - x) by { reveal Gcd(); } } method EuclidGcdAlt(X: pos, Y: pos) returns (gcd: pos) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue1.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue1.dfy index f3dca105a6..7c66005315 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue1.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue1.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings datatype T = T(n:int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue18.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue18.dfy index dd6abb8ae7..ad3a3a76de 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue18.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue18.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings datatype Maybe = Nothing | Just diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue22.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue22.dfy index 3bac5d690a..e929b1dbba 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue22.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue22.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings ghost predicate bad() diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue42.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue42.dfy index 612c5528a2..0da1f6ce98 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue42.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue42.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --warn-shadowing "%s" > "%t" +// RUN: %verify --warn-shadowing --allow-warnings "%s" > "%t" // RUN: %diff "%s.expect" "%t" lemma L(x:int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue48.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue48.dfy index 1d2b776a69..cb23215432 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue48.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue48.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings include "git-issue48-include.dfyi" diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue75.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue75.dfy index 9c833d8652..37b4a2f292 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue75.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue75.dfy @@ -1,4 +1,4 @@ -// RUN: %verify "%s" > "%t" +// RUN: %verify "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" type t = i:int | 0 <= i < 10 diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue92.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue92.dfy index dfd9e1967e..c3c1d34bcd 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue92.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue92.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings datatype d = D(i:int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue96.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue96.dfy index ece6846e07..861b465368 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue96.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/dafny4/git-issue96.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings ghost predicate P(s:seq) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy index 09744e91a4..0f55dec43a 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy @@ -1,5 +1,5 @@ -// RUN: %build %s -t:lib --allow-warnings --output="%S/Output/allowWarnings.doo" > "%t" -// RUN: %resolve %s %S/Output/allowWarnings.doo >> %t +// RUN: %build %s -t:lib --allow-warnings --output="%S/Output/allowWarnings.doo" &> "%t" +// RUN: ! %stdin "method Bar() { }" %resolve --stdin %S/Output/allowWarnings.doo &>> %t // RUN: %diff "%s.expect" "%t" method Foo() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy.expect index 06400d05c3..2a1bfb0edd 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/doofiles/allowWarningsDoo.dfy.expect @@ -1,5 +1,4 @@ Dafny program verifier finished with 0 verified, 0 errors CLI: Warning: cannot load allowWarnings.doo: --allow-warnings is set locally to False, but the library was built with True - -Dafny program verifier did not attempt verification +Compilation failed because warnings were found and --allow-warnings is false diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-032a.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-032a.dfy index 25970f3d61..08dae444dc 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-032a.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-032a.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings method m() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2265.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2265.dfy index 31d39b3852..1bbd364881 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2265.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2265.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings module DefaultModule { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2299.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2299.dfy.expect index 2bb07b70a7..802b5ada1d 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2299.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2299.dfy.expect @@ -10,10 +10,10 @@ git-issue-2299.dfy(81,11): Error: assertion might not hold git-issue-2299.dfy(27,4): Related location: this proposition could not be proved git-issue-2299.dfy(10,11): Related location: this proposition could not be proved git-issue-2299.dfy(81,11): Error: assertion might not hold -git-issue-2299.dfy(27,18): Related location: this proposition could not be proved -git-issue-2299.dfy(16,4): Related location: this proposition could not be proved -git-issue-2299.dfy(81,11): Error: assertion might not hold git-issue-2299.dfy(27,32): Related location: this proposition could not be proved git-issue-2299.dfy(21,4): Related location: this proposition could not be proved +git-issue-2299.dfy(81,11): Error: assertion might not hold +git-issue-2299.dfy(27,18): Related location: this proposition could not be proved +git-issue-2299.dfy(16,4): Related location: this proposition could not be proved Dafny program verifier finished with 7 verified, 7 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2593.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2593.dfy index fb26738788..f2011067c2 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2593.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2593.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings ghost predicate P(x: int) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2747.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2747.dfy index ce214ae6a9..69ad728a87 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2747.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-2747.dfy @@ -1,4 +1,4 @@ -// RUN: %testDafnyForEachResolver "%s" +// RUN: %testDafnyForEachResolver "%s" -- --allow-warnings ghost function AnotherBrokenFunction(): nat { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3288c.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3288c.dfy index e7f93ed7ea..c59a2794f9 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3288c.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3288c.dfy @@ -1,4 +1,4 @@ -// RUN: %verify "%s" > "%t" +// RUN: %verify "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" module M { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3358.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3358.dfy index dd79f2faaa..01b25cc589 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3358.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3358.dfy @@ -1,4 +1,4 @@ -// RUN: %verify "%s" > "%t" +// RUN: %verify "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" datatype MyResult = Ok | Err(error: set) diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3496.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3496.dfy index 62f2adbcb7..f78785490b 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3496.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3496.dfy @@ -1,4 +1,4 @@ -// RUN: %resolve --allow-axioms:false "%s" > "%t" +// RUN: %resolve --allow-axioms:false --allow-warnings "%s" > "%t" // RUN: %diff "%s.expect" "%t" method m() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3497.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3497.dfy index d452775c85..f6a4d39e0b 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3497.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-3497.dfy @@ -1,4 +1,4 @@ -// RUN: %resolve "%s" > "%t" +// RUN: %resolve "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" method m() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-405.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-405.dfy.expect index 86505e65a9..c489ea4b66 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-405.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-405.dfy.expect @@ -1,3 +1,3 @@ -git-issue-405.dfy(19,22): Error: insufficient reads clause to read field +git-issue-405.dfy(19,22): Error: insufficient reads clause to read field; Consider extracting x to a local variable before the lambda expression, or adding 'reads this' in the enclosing lambda specification for resolution Dafny program verifier finished with 6 verified, 1 error diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4778.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4778.dfy index 5cc6f56d8a..216baa17c0 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4778.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4778.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --warn-contradictory-assumptions "%s" > "%t" +// RUN: %verify --warn-contradictory-assumptions --allow-warnings "%s" > "%t" // DIFF: "%s.expect" "%t" type CodeUnit diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy new file mode 100644 index 0000000000..2d2b01476d --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy @@ -0,0 +1,11 @@ +// RUN: %baredafny verify %args --type-system-refresh --general-traits=datatype "%s" > "%t" +// RUN: %diff "%s.expect" "%t" + +trait Test { + function Cast(t: T): Test +} + +datatype Impl extends Test = ImplConstructor() +{ + function Cast(t: Impl): Test { t } +} \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy.expect new file mode 100644 index 0000000000..823a60a105 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-4823.dfy.expect @@ -0,0 +1,2 @@ + +Dafny program verifier finished with 1 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy new file mode 100644 index 0000000000..3f84ac8126 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy @@ -0,0 +1,38 @@ +// RUN: %exits-with 4 %verify "%s" > "%t" +// RUN: %diff "%s.expect" "%t" + +function F(a: array): int + requires a.Length > 0 +{ + a[0] // Suggests to "read a" +} + +class C { + var data: int + + function G(): int { + // Amazing! I don't think I've ever thought about that ` has really low binding power, + // so the suggestion "reads var th := this; th`data" in the following line works! + (var th := this; th).data + } + + function H(): int { + var th := this; + // the suggestion here is to use "reads th#Z" (maybe it's better to give up with + // a precise "reads" term if the receiver looks complicated, for some definition + // of complicated) + th.data + } +} + +codatatype Stream = More(int, Stream) + +function Repeat(c: C): Stream { + // Here, it would be better not to give a "reads" suggestion, since functions with + // co-recursive calls aren't allowed to have a reads clause. (The AST contain + // information that says whether or not a call is co-recursive. But I'm not sure if + // the AST remembers which functions are sometimes targets of co-recursive calls. + // You could add this. If so, the place to mark a function as such is right next to + // the ".IsCoCall = true" in ModuleResolver.cs.) + More(c.data, Repeat(c)) +} \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy.expect new file mode 100644 index 0000000000..c3ea26ed53 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5262.dfy.expect @@ -0,0 +1,6 @@ +git-issue-5262.dfy(7,3): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing function specification for resolution +git-issue-5262.dfy(16,25): Error: insufficient reads clause to read field; Consider adding 'reads var th: C := this; th' or 'reads var th: C := this; th`data' in the enclosing function specification for resolution +git-issue-5262.dfy(24,7): Error: insufficient reads clause to read field; Consider adding 'reads th' or 'reads th`data' in the enclosing function specification for resolution +git-issue-5262.dfy(37,9): Error: insufficient reads clause to read field; Mutable fields cannot be accessed within certain scopes, such as default values, the right-hand side of constants, or co-recursive calls + +Dafny program verifier finished with 0 verified, 4 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy new file mode 100644 index 0000000000..e0a64ce212 --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy @@ -0,0 +1,27 @@ +// RUN: %testDafnyForEachResolver --expect-exit-code=2 "%s" + +datatype Pair = MakePair(0: T, 1: T) { + function Same(): bool { + this.0 == this.1 + } +} + +method ReturnFalse() returns (b: bool) + ensures !b +{ + var c := (2, ghost 5); + var d := (2, ghost 6); + assert c != d; + b := MakePair(c, d).Same(); // error: uses the type Pair incorrectly + + print MakePair(c, d); // error: uses the type Pair incorrectly + print "\n"; +} + +method Main() { + var b := ReturnFalse(); + if b { + // we should never get here + print 10 / 0; + } +} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy.expect new file mode 100644 index 0000000000..c01e30267f --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5274.dfy.expect @@ -0,0 +1,3 @@ +git-issue-5274.dfy(15,7): Error: type parameter (T) passed to type Pair must support equality (got (int, ghost int)) +git-issue-5274.dfy(17,8): Error: type parameter (T) passed to type Pair must support equality (got (int, ghost int)) +2 resolution/type errors detected in git-issue-5274.dfy diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy new file mode 100644 index 0000000000..905e63e3da --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy @@ -0,0 +1,20 @@ +// RUN: %testDafnyForEachCompiler "%s" + +const someSet := + set + someString <- {"D"}, + someChar <- + set c <- someString :: c + :: someChar + +const someMap := + map x | + 0 < x < 3 + && x in + map y : int | 0 <= y <= x :: y + :: x * x + +method Main() { + print someSet, "\n"; + print someMap, "\n"; +} \ No newline at end of file diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy.expect new file mode 100644 index 0000000000..c7b79cf39a --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-5285.dfy.expect @@ -0,0 +1,2 @@ +{'D'} +map[1 := 1, 2 := 4] diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-845.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-845.dfy index cc9976fd91..667632373f 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-845.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-845.dfy @@ -1,4 +1,4 @@ -// RUN: %verify %S/git-issue-845.dfy > "%t" +// RUN: %verify %S/git-issue-845.dfy --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" /* blah blah /* blah */ diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy index 8fb9494c81..6cc88379b3 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy @@ -7,7 +7,7 @@ ghost function missing_number(nums: seq): nat { var p := x => 0 <= x <= |nums| && x !in nums; assert exists x :: p(x) && forall y :: p(y) ==> y == x by { - var range := set i | 0 <= i <= |nums|; + var range := set i {:trigger} | 0 <= i <= |nums|; assume |range| == |nums| + 1; var missing := range - set i | i in nums; assert |missing| == 1; diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy.expect index b2b4a91b6f..823a60a105 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/git-issue-897a.dfy.expect @@ -1,3 +1,2 @@ -git-issue-897a.dfy(10,17): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Dafny program verifier finished with 1 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/github-issue-4144.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/github-issue-4144.dfy index 070c277615..745cfad731 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/github-issue-4144.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/git-issues/github-issue-4144.dfy @@ -1,4 +1,4 @@ -// RUN: %verify %s > %t +// RUN: %verify --allow-warnings %s > %t // RUN: %diff "%s.expect" "%t" module P { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Frame.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Frame.dfy.expect index b39a812b6b..6d5d58a4d4 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Frame.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/Frame.dfy.expect @@ -1,8 +1,8 @@ Frame.dfy(23,15): Error: assertion might not hold Frame.dfy(37,13): Error: assertion might not hold Frame.dfy(63,22): Error: assertion might not hold -Frame.dfy(66,18): Error: insufficient reads clause to read array element -Frame.dfy(68,27): Error: insufficient reads clause to read array element +Frame.dfy(66,18): Error: insufficient reads clause to read array element; Consider extracting a[0] to a local variable before the lambda expression, or adding 'reads a' in the enclosing lambda specification for resolution +Frame.dfy(68,27): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing lambda specification for resolution Frame.dfy(120,17): Error: function precondition could not be proved Frame.dfy(123,18): Error: assertion might not hold diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy index 51c687cea9..4a7f8894e4 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy @@ -74,7 +74,7 @@ lemma BetaReductionInside(n': nat, g: (int,int) -> int) ensures Sum(n', x => g(x,n') + Sum(n', y => g(x,y))) == Sum(n', x => (w => g(w,n'))(x) + (w => Sum(n', y => g(w,y)))(x)) { - forall i | 0 <= i < n' + forall i {:trigger} | 0 <= i < n' { calc { (x => g(x,n') + Sum(n', y => g(x,y)))(i); @@ -103,7 +103,7 @@ lemma L(n: nat, n': nat, g: (int, int) -> int) { assert (y => g(n',y))(n') == g(n',n'); } g(n',n') + Sum(n', y => g(n',y)) + Sum(n', x => Sum(n, y => g(x,y))); { - forall i | 0 <= i < n' { + forall i {:trigger} | 0 <= i < n' { calc { (x => Sum(n, y => g(x,y)))(i); { PrettyBasicBetaReduction(n, g, i); } diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy.expect index 081616a94b..ccc01c35f4 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/hofs/SumSum.dfy.expect @@ -1,4 +1,2 @@ -SumSum.dfy(77,2): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. -SumSum.dfy(106,6): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. Dafny program verifier finished with 11 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/linters/constructorCaseWithoutParentheses.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/linters/constructorCaseWithoutParentheses.dfy index c93907cc5a..19ec978d8b 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/linters/constructorCaseWithoutParentheses.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/linters/constructorCaseWithoutParentheses.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --warn-missing-constructor-parentheses "%s" > "%t" +// RUN: %verify --warn-missing-constructor-parentheses "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" module WithWarning { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/logger/ProofDependencyWarnings.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/logger/ProofDependencyWarnings.dfy index 6b5f52e5bd..5ef994e089 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/logger/ProofDependencyWarnings.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/logger/ProofDependencyWarnings.dfy @@ -1,4 +1,4 @@ -// RUN: %baredafny verify --use-basename-for-filename --allow-axioms --show-snippets false --verify-included-files --warn-contradictory-assumptions --warn-redundant-assumptions "%s" > "%t.new" +// RUN: %baredafny verify --use-basename-for-filename --allow-axioms --show-snippets false --verify-included-files --warn-contradictory-assumptions --warn-redundant-assumptions --allow-warnings "%s" > "%t.new" // RUN: %diff "%s.expect" "%t.new" // RUN: %baredafny /compile:0 /useBaseNameForFileName /verifyAllModules /warnContradictoryAssumptions /warnRedundantAssumptions "%s" > "%t.old" // RUN: %diff "%s.expect" "%t.old" diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestMissingVerifierExpect.dfy.testdafny.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestMissingVerifierExpect.dfy.testdafny.expect index 4a06fe9d9b..b73dd50e4a 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestMissingVerifierExpect.dfy.testdafny.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestMissingVerifierExpect.dfy.testdafny.expect @@ -2,5 +2,6 @@ Using legacy resolver and verifying... AssertEqualWithDiff() Failure Diff (changing expected into actual): +TestMissingVerifierExpect.dfy(6,5): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. ++Compilation failed because warnings were found and --allow-warnings is false + diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestWrongVerifierExpect.dfy.testdafny.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestWrongVerifierExpect.dfy.testdafny.expect index fe05592e8a..a619131d40 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestWrongVerifierExpect.dfy.testdafny.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/metatests/TestWrongVerifierExpect.dfy.testdafny.expect @@ -3,5 +3,6 @@ AssertEqualWithDiff() Failure Diff (changing expected into actual): -warning: out of bananas +TestWrongVerifierExpect.dfy(6,5): Warning: Could not find a trigger for this quantifier. Without a trigger, the quantifier may cause brittle verification. To silence this warning, add an explicit trigger using the {:trigger} attribute. For more information, see the section quantifier instantiation rules in the reference manual. ++Compilation failed because warnings were found and --allow-warnings is false diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/loop-detection-messages--unit-tests.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/loop-detection-messages--unit-tests.dfy index 6a32aaadbb..5b3d54288c 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/loop-detection-messages--unit-tests.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/loop-detection-messages--unit-tests.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --show-inference "%s" > "%t" +// RUN: %verify --show-inference --allow-warnings "%s" > "%t" // RUN: %diff "%s.expect" "%t" // This file is a series of basic tests for loop detection, focusing on the diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/old-is-a-special-case-for-triggers.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/old-is-a-special-case-for-triggers.dfy index a18aee5db5..8d0edd0e2a 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/old-is-a-special-case-for-triggers.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/old-is-a-special-case-for-triggers.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --show-inference "%s" > "%t" +// RUN: %verify --show-inference "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" // This file ensures that `old()` receives the special treatment that it diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/regression-tests.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/regression-tests.dfy index 8bf9dbd2e7..4e5320d089 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/regression-tests.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/regression-tests.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --show-inference "%s" > "%t" +// RUN: %verify --show-inference "%s" --allow-warnings > "%t" // RUN: %diff "%s.expect" "%t" // This tests checks that quantifier splitting is resilient to the fact that diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/suppressing-warnings-behaves-properly.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/suppressing-warnings-behaves-properly.dfy index 8f23b16ace..ce7f477d01 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/suppressing-warnings-behaves-properly.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/triggers/suppressing-warnings-behaves-properly.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --show-inference "%s" > "%t" +// RUN: %verify --show-inference --allow-warnings "%s" > "%t" // RUN: %diff "%s.expect" "%t" // This file checks that suppressing warnings works properly diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/filter.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/filter.dfy index 0db23fb833..c5cb15cc76 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/filter.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/filter.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --filter-position='C:\windows\path.dfy' %s > %t +// RUN: %verify --allow-warnings --filter-position='C:\windows\path.dfy' %s > %t // RUN: ! %verify --filter-position='src/source1.dfy:5' %S/Inputs/dfyconfig.toml >> %t // RUN: %verify --filter-position='src/source1.dfy:1' %S/Inputs/dfyconfig.toml >> %t // RUN: ! %verify --filter-position='e.dfy' %S/Inputs/single-file.dfy >> %t diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy index 327bc1ea5b..c992fcd4c2 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy @@ -1,5 +1,5 @@ // RUN: %verify --progress --cores=1 %s &> %t.raw -// RUN: %sed 's/time: \d*ms/redacted/g' "%t".raw > %t +// RUN: %sed 's/taking \d*ms/redacted/g' %t.raw > %t // RUN: %diff "%s.expect" "%t" method {:isolate_assertions} Foo() { diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy.expect index 524e0c4e9e..66919320ee 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/isolate-assertions.dfy.expect @@ -1,8 +1,8 @@ Verified 0/2 symbols. Waiting for Foo to verify. -Verified part 1/3 of Foo, on line 5 (redacted, resource count: 8.7E+002) -Verified part 2/3 of Foo, on line 6 (redacted, resource count: 3.1E+003) -Verified part 3/3 of Foo, on line 7 (redacted, resource count: 2.8E+003) +Verification part 1/3 of Foo, on line 5, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/3 of Foo, on line 6, verified successfully, redacted and consuming 3.1E+003 resources +Verification part 3/3 of Foo, on line 7, verified successfully, redacted and consuming 2.8E+003 resources Verified 1/2 symbols. Waiting for Bar to verify. -Verified part 1/1 of Bar, on line 10 (redacted, resource count: 3.1E+003) +Verification part 1/1 of Bar, on line 10, verified successfully, redacted and consuming 3.1E+003 resources Dafny program verifier finished with 4 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy new file mode 100644 index 0000000000..099fea64ca --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy @@ -0,0 +1,13 @@ +// RUN: ! %verify --isolate-assertions --cores=1 --progress "%s" &> %t.raw +// RUN: %sed 's/taking \d*ms/redacted/g' %t.raw > %t +// RUN: %diff "%s.expect" %t + +ghost function f(i:nat, j:nat):int {if i == 0 then 0 else f(i - 1, i * j + 1) + f(i - 1, 2 * i * j)} + +lemma{:resource_limit 10000000} L() +{ + assert true; + assert f(10, 5) == 0; // runs out of resources + assert true; + assert f(10, 6) == 0; // runs out of resources +} diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy.expect new file mode 100644 index 0000000000..312e7ad0ed --- /dev/null +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/outOfResourceAndIsolateAssertions.dfy.expect @@ -0,0 +1,26 @@ +Verified 0/2 symbols. Waiting for f to verify. +Verification part 1/11 of f, on line 5, verified successfully, redacted and consuming 9.5E+002 resources +Verification part 2/11 of f, on line 5, verified successfully, redacted and consuming 6.2E+003 resources +Verification part 3/11 of f, on line 5, verified successfully, redacted and consuming 6.7E+003 resources +Verification part 4/11 of f, on line 5, verified successfully, redacted and consuming 6.6E+003 resources +Verification part 5/11 of f, on line 5, verified successfully, redacted and consuming 5.8E+003 resources +Verification part 6/11 of f, on line 5, verified successfully, redacted and consuming 5.8E+003 resources +Verification part 7/11 of f, on line 5, verified successfully, redacted and consuming 5.8E+003 resources +Verification part 8/11 of f, on line 5, verified successfully, redacted and consuming 7.8E+003 resources +Verification part 9/11 of f, on line 5, verified successfully, redacted and consuming 6.0E+003 resources +Verification part 10/11 of f, on line 5, verified successfully, redacted and consuming 6.0E+003 resources +Verification part 11/11 of f, on line 5, verified successfully, redacted and consuming 6.0E+003 resources +Verified 1/2 symbols. Waiting for L to verify. +Verification part 1/9 of L, on line 7, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/9 of L, on line 9, verified successfully, redacted and consuming 5.6E+003 resources +Verification part 3/9 of L, on line 10, verified successfully, redacted and consuming 5.7E+003 resources +Verification part 4/9 of L, on line 10, verified successfully, redacted and consuming 6.0E+003 resources +Verification part 5/9 of L, on line 10, ran out of resources, redacted and consuming 1.0E+007 resources +Verification part 6/9 of L, on line 11, verified successfully, redacted and consuming 5.4E+003 resources +Verification part 7/9 of L, on line 12, verified successfully, redacted and consuming 5.5E+003 resources +Verification part 8/9 of L, on line 12, verified successfully, redacted and consuming 6.8E+003 resources +Verification part 9/9 of L, on line 12, ran out of resources, redacted and consuming 1.0E+007 resources +outOfResourceAndIsolateAssertions.dfy(10,18): Error: Verification out of resource (L) +outOfResourceAndIsolateAssertions.dfy(12,18): Error: Verification out of resource (L) + +Dafny program verifier finished with 18 verified, 0 errors, 2 out of resource diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy index c3badc8ec6..90626b23cb 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy @@ -1,5 +1,5 @@ // RUN: %verify --progress --isolate-assertions --cores=1 %s > %t.raw -// RUN: %sed 's/time: \d*ms/redacted/g' "%t".raw > %t +// RUN: %sed 's/taking \d*ms/redacted/g' %t.raw > %t // RUN: %diff "%s.expect" "%t" method Foo() diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy.expect b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy.expect index 9b3819de3c..3110aa5d72 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy.expect +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/verification/progress.dfy.expect @@ -1,19 +1,19 @@ Verified 0/5 symbols. Waiting for Foo to verify. -Verified part 1/3 of Foo, on line 5 (redacted, resource count: 8.7E+002) -Verified part 2/3 of Foo, on line 7 (redacted, resource count: 3.1E+003) -Verified part 3/3 of Foo, on line 8 (redacted, resource count: 2.8E+003) +Verification part 1/3 of Foo, on line 5, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/3 of Foo, on line 7, verified successfully, redacted and consuming 3.1E+003 resources +Verification part 3/3 of Foo, on line 8, verified successfully, redacted and consuming 2.8E+003 resources Verified 1/5 symbols. Waiting for Faz to verify. -Verified part 1/2 of Faz, on line 11 (redacted, resource count: 8.7E+002) -Verified part 2/2 of Faz, on line 11 (redacted, resource count: 3.1E+003) +Verification part 1/2 of Faz, on line 11, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/2 of Faz, on line 11, verified successfully, redacted and consuming 3.1E+003 resources Verified 2/5 symbols. Waiting for Fopple to verify. -Verified part 1/2 of Fopple, on line 13 (redacted, resource count: 8.7E+002) -Verified part 2/2 of Fopple, on line 13 (redacted, resource count: 3.1E+003) +Verification part 1/2 of Fopple, on line 13, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/2 of Fopple, on line 13, verified successfully, redacted and consuming 3.1E+003 resources Verified 3/5 symbols. Waiting for Burp to verify. -Verified part 1/3 of Burp, on line 15 (redacted, resource count: 8.7E+002) -Verified part 2/3 of Burp, on line 17 (redacted, resource count: 3.1E+003) -Verified part 3/3 of Burp, on line 18 (redacted, resource count: 2.8E+003) +Verification part 1/3 of Burp, on line 15, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/3 of Burp, on line 17, verified successfully, redacted and consuming 3.1E+003 resources +Verification part 3/3 of Burp, on line 18, verified successfully, redacted and consuming 2.8E+003 resources Verified 4/5 symbols. Waiting for Blanc to verify. -Verified part 1/2 of Blanc, on line 21 (redacted, resource count: 8.7E+002) -Verified part 2/2 of Blanc, on line 21 (redacted, resource count: 3.1E+003) +Verification part 1/2 of Blanc, on line 21, verified successfully, redacted and consuming 8.7E+002 resources +Verification part 2/2 of Blanc, on line 21, verified successfully, redacted and consuming 3.1E+003 resources Dafny program verifier finished with 12 verified, 0 errors diff --git a/Source/IntegrationTests/TestFiles/LitTests/LitTest/wishlist/we-should-always-print-tooltips.dfy b/Source/IntegrationTests/TestFiles/LitTests/LitTest/wishlist/we-should-always-print-tooltips.dfy index 85b5a7b0ae..8a3069f419 100644 --- a/Source/IntegrationTests/TestFiles/LitTests/LitTest/wishlist/we-should-always-print-tooltips.dfy +++ b/Source/IntegrationTests/TestFiles/LitTests/LitTest/wishlist/we-should-always-print-tooltips.dfy @@ -1,4 +1,4 @@ -// RUN: %verify --show-inference %s > "%t" +// RUN: %verify --show-inference --allow-warnings %s > "%t" // RUN: %diff "%s.expect" "%t" // WISH it would be great to add /printTooltips to all tests diff --git a/Source/TestDafny/MultiBackendTest.cs b/Source/TestDafny/MultiBackendTest.cs index ce923a5a97..ecc618b7c9 100644 --- a/Source/TestDafny/MultiBackendTest.cs +++ b/Source/TestDafny/MultiBackendTest.cs @@ -298,8 +298,6 @@ private static bool OptionAppliesToVerifyCommand(string option) { CommonOptionBag.SpillTranslation, CommonOptionBag.OptimizeErasableDatatypeWrapper, CommonOptionBag.AddCompileSuffix, - BoogieOptionBag.SolverResourceLimit, - BoogieOptionBag.VerificationTimeLimit, RunCommand.MainOverride, }.Select(o => o.Name); diff --git a/Test/git-issues/git-issue-4181.dfy b/Test/git-issues/git-issue-4181.dfy new file mode 100644 index 0000000000..1f6928be6c --- /dev/null +++ b/Test/git-issues/git-issue-4181.dfy @@ -0,0 +1,11 @@ +// RUN: %testDafnyForEachCompiler "%s" + +module C { + method Test() { + print "done\n"; + } +} + +method Main(){ + C.Test(); +} \ No newline at end of file diff --git a/Test/git-issues/git-issue-4181.dfy.expect b/Test/git-issues/git-issue-4181.dfy.expect new file mode 100644 index 0000000000..19f86f493a --- /dev/null +++ b/Test/git-issues/git-issue-4181.dfy.expect @@ -0,0 +1 @@ +done diff --git a/docs/DafnyRef/Modules.md b/docs/DafnyRef/Modules.md index ab757469ce..31ee26bbfe 100644 --- a/docs/DafnyRef/Modules.md +++ b/docs/DafnyRef/Modules.md @@ -352,9 +352,8 @@ Examples: ```dafny export E extends F reveals f,g provides g,h export E reveals * -export reveals f +export reveals f,g provides g,h export E -export export E ... reveals f ``` @@ -375,15 +374,16 @@ module using the `import` mechanism. An _export set_ enables a module to disallow the use of some declarations outside the module. -Export sets have names; those names are used in `import` statements to -designate which export set of a module is being imported. -If a module `M` has export sets -`E1` and `E2`, we can write ``import A = M`E1`` to create a module alias -`A` that contains only the -names in `E1`. Or we can write ``import A = M`{E1,E2}`` to import the union +An export set has an optional name used to disambiguate +in case of multiple export sets; +If specified, such names are used in `import` statements +to designate which export set of a module is being imported. +If a module `M` has export sets `E1` and `E2`, +we can write ``import A = M`E1`` to create a module alias +`A` that contains only the names in `E1`. +Or we can write ``import A = M`{E1,E2}`` to import the union of names in `E1` and `E2` as module alias `A`. -As before, ``import M`E1`` is an -abbreviation of ``import M = M`E1``. +As before, ``import M`E1`` is an abbreviation of ``import M = M`E1``. If no export set is given in an import statement, the default export set of the module is used. diff --git a/docs/OnlineTutorial/guide.20.expect b/docs/OnlineTutorial/guide.20.expect index 1e4b70abf5..8cd4f6b8f8 100644 --- a/docs/OnlineTutorial/guide.20.expect +++ b/docs/OnlineTutorial/guide.20.expect @@ -1,3 +1,3 @@ -text.dfy(3,44): Error: insufficient reads clause to read array element +text.dfy(3,44): Error: insufficient reads clause to read array element; Consider adding 'reads a' in the enclosing predicate specification for resolution Dafny program verifier finished with 0 verified, 1 error diff --git a/docs/check-examples b/docs/check-examples index d716422a20..e43a9acb19 100755 --- a/docs/check-examples +++ b/docs/check-examples @@ -340,6 +340,7 @@ do if [ -z "$expect" -a "$useHeadings" == "0" ]; then defaultExit=0 elif [ "$iswarn" == "1" ]; then + dOptions="$dOptions --allow-warnings" defaultExit=0 elif [ "$verb" == "verify" ]; then defaultExit=4 diff --git a/docs/dev/news/4181.fix b/docs/dev/news/4181.fix new file mode 100644 index 0000000000..2678836452 --- /dev/null +++ b/docs/dev/news/4181.fix @@ -0,0 +1 @@ +Reserved module identifiers correctly escaped in GoLang \ No newline at end of file diff --git a/docs/dev/news/4823.fix b/docs/dev/news/4823.fix new file mode 100644 index 0000000000..400cee8379 --- /dev/null +++ b/docs/dev/news/4823.fix @@ -0,0 +1 @@ +Ability to cast a datatype to its trait when overriding functions \ No newline at end of file diff --git a/docs/dev/news/5262.fix b/docs/dev/news/5262.fix new file mode 100644 index 0000000000..07d10bb16f --- /dev/null +++ b/docs/dev/news/5262.fix @@ -0,0 +1 @@ +More helpful error messages when read fields not mentioned in reads clauses \ No newline at end of file diff --git a/docs/dev/news/5278.fix b/docs/dev/news/5278.fix new file mode 100644 index 0000000000..0252a1f02c --- /dev/null +++ b/docs/dev/news/5278.fix @@ -0,0 +1 @@ +Check datatype constructors for bad type-parameter instantiations diff --git a/docs/dev/news/5281.feat b/docs/dev/news/5281.feat new file mode 100644 index 0000000000..1eacc1e782 --- /dev/null +++ b/docs/dev/news/5281.feat @@ -0,0 +1 @@ +Improved error reporting when verification times out or runs out of resources, so that when using `--isolate-assertions`, the error message points to the problematic assertion. \ No newline at end of file diff --git a/docs/dev/news/5287.fix b/docs/dev/news/5287.fix new file mode 100644 index 0000000000..a2ec230054 --- /dev/null +++ b/docs/dev/news/5287.fix @@ -0,0 +1 @@ +Invalid Python code for nested set and map comprehensions