From 743bcb441e270b3ce66b49e513a2b417caa71ca8 Mon Sep 17 00:00:00 2001 From: "Ogilvie, D.H. (Duncan)" <d.h.ogilvie2@students.uu.nl> Date: Sun, 22 Oct 2017 14:18:22 +0200 Subject: [PATCH] Implement more free lambdas Closes #13 --- src/LogicIR/Frontend/Java.hs | 17 +++++++++++++---- src/SimpleFormulaChecker.hs | 3 ++- .../src/nl/uu/javawlp_edsl/Main.java | 6 ++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/LogicIR/Frontend/Java.hs b/src/LogicIR/Frontend/Java.hs index f5c6072..7d63f3c 100644 --- a/src/LogicIR/Frontend/Java.hs +++ b/src/LogicIR/Frontend/Java.hs @@ -46,14 +46,23 @@ javaExpToLExprAlgebra = (fLit, fClassLit, fThis, fThisClass, fInstanceCreation, fMethodInv inv env decls = case inv of -- TODO: very hardcoded EDSL + lambdas cannot be { return expr; } + ranged -- Java: forall(name, bound -> expr); MethodCall (Name [Ident "forall"]) [ExpName name, Lambda (LambdaSingleParam (Ident bound)) (LambdaExpression expr)] - -> let (i, arr) = (Var (TPrim PInt32) bound, nameToVar name env decls) in - LQuant QAll i (LBinop (LBinop (LComp (LVar i) CGeq (NConst 0)) LAnd (LComp (LVar i) CLess (NLen arr))) LImpl (foldExp javaExpToLExprAlgebra expr env decls)) + -> forall name bound expr -- Java: exists(name, bound -> expr); MethodCall (Name [Ident "exists"]) [ExpName name, Lambda (LambdaSingleParam (Ident bound)) (LambdaExpression expr)] - -> let (i, arr) = (Var (TPrim PInt32) bound, nameToVar name env decls) in - LQuant QAny i (LBinop (LBinop (LComp (LVar i) CGeq (NConst 0)) LAnd (LComp (LVar i) CLess (NLen arr))) LAnd (foldExp javaExpToLExprAlgebra expr env decls)) + -> exists name bound expr + -- Java: forall(name, bound -> { return expr; }); + MethodCall (Name [Ident "forall"]) [ExpName name ,Lambda (LambdaSingleParam (Ident bound)) (LambdaBlock (Block [BlockStmt (Return (Just expr))]))] + -> forall name bound expr + -- Java: exists(name, bound -> { return expr; }); + MethodCall (Name [Ident "exists"]) [ExpName name ,Lambda (LambdaSingleParam (Ident bound)) (LambdaBlock (Block [BlockStmt (Return (Just expr))]))] + -> exists name bound expr _ -> error $ "Unimplemented fMethodInv: " ++ show inv + + where forall name bound expr = let (i, arr) = (Var (TPrim PInt32) bound, nameToVar name env decls) in + LQuant QAll i (LBinop (LBinop (LComp (LVar i) CGeq (NConst 0)) LAnd (LComp (LVar i) CLess (NLen arr))) LImpl (foldExp javaExpToLExprAlgebra expr env decls)) + exists name bound expr = let (i, arr) = (Var (TPrim PInt32) bound, nameToVar name env decls) in + LQuant QAny i (LBinop (LBinop (LComp (LVar i) CGeq (NConst 0)) LAnd (LComp (LVar i) CLess (NLen arr))) LAnd (foldExp javaExpToLExprAlgebra expr env decls)) fArrayAccess arrayIndex env decls = case arrayIndex of -- TODO: type checking ArrayIndex (ExpName name) [expr] -> LArray (nameToVar name env decls) (javaExpToLExpr expr env decls) diff --git a/src/SimpleFormulaChecker.hs b/src/SimpleFormulaChecker.hs index 455cd08..dadcc66 100644 --- a/src/SimpleFormulaChecker.hs +++ b/src/SimpleFormulaChecker.hs @@ -131,4 +131,5 @@ edslSrc = "javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java" testEq = compareSpec (edslSrc, "swap_spec1") (edslSrc, "swap_spec1") testNeq = compareSpec (edslSrc, "swap_spec1") (edslSrc, "swap_spec2") blub = compareSpec (edslSrc, "getMax_spec1") (edslSrc, "getMax_spec2") -blub2 = compareSpec (edslSrc, "test1") (edslSrc, "test2") \ No newline at end of file +blub2 = compareSpec (edslSrc, "test1") (edslSrc, "test2") +blob = compareSpec (edslSrc, "blob1") (edslSrc, "blob1") \ No newline at end of file diff --git a/src/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java b/src/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java index 9a61276..6cd5993 100644 --- a/src/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java +++ b/src/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java @@ -107,6 +107,12 @@ public class Main { post(a[i] == oldaj); } + public static void blob1(int[] a) + { + pre(forall(a, i -> { return a[i] == 0; })); + post(true); + } + public static void test1(int[] a) { pre(exists(a, i -> a[i+1] > a[i])); -- GitLab