From a1cf5cb9da76a4ae1651a1f51ecffa971b856812 Mon Sep 17 00:00:00 2001 From: Ralf Jung <jung@mpi-sws.org> Date: Mon, 18 Feb 2019 13:51:33 +0100 Subject: [PATCH] we need unlocked value lambdas --- HeapLang.md | 10 +++++----- theories/heap_lang/lib/par.v | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/HeapLang.md b/HeapLang.md index 0ac3a23b9..b9f2cd112 100644 --- a/HeapLang.md +++ b/HeapLang.md @@ -117,11 +117,11 @@ The normal `e1 ||| e2` notation uses expression lambdas, because clearly we want value lambda). However, the *specification* for parallel composition should use value lambdas, because prior to applying it the term will be reduced as much as possible to achieve a normal form. To facilitate this, we define a copy of the -`e1 ||| e2` notation in the value scope that uses value lambdas. This is not -actually a value, but we still but it in the value scope to differentiate from -the other notation that uses expression lambdas. (In the future, we might -decide to add a separate scope for this.) Then, we write the canonical -specification using the notation in the value scope. +`e1 ||| e2` notation in the value scope that uses *unlocked* value lambdas. +This is not actually a value, but we still but it in the value scope to +differentiate from the other notation that uses expression lambdas. (In the +future, we might decide to add a separate scope for this.) Then, we write the +canonical specification using the notation in the value scope. This works very well for non-recursive notions. For `while` loops, the situation is unfortunately more complex and proving the desired specification diff --git a/theories/heap_lang/lib/par.v b/theories/heap_lang/lib/par.v index 558853f4f..d073142e2 100644 --- a/theories/heap_lang/lib/par.v +++ b/theories/heap_lang/lib/par.v @@ -12,7 +12,7 @@ Definition par : val := let: "v1" := join "handle" in ("v1", "v2"). Notation "e1 ||| e2" := (par (λ: <>, e1)%E (λ: <>, e2)%E) : expr_scope. -Notation "e1 ||| e2" := (par (λ: <>, e1)%V (λ: <>, e2)%V) : val_scope. +Notation "e1 ||| e2" := (par (LamV BAnon e1%E) (LamV BAnon e2%E)) : val_scope. Section proof. Local Set Default Proof Using "Type*". -- GitLab