termination


Unsolvable size constraints


I want to define a size-preserving function on derivations of a transition relation for pi calculus. I'm not able to convince Agda that it is indeed size-preserving. I'm also getting an error message which appears non-sensical, so perhaps there's a clue in there.
I've boiled the code down as much as possible whilst still retaining the flavour of the setting. Here's the preamble.
{-# OPTIONS --sized-types #-}
module SizedTypes where
open import Data.Product public hiding (swap)
open import Relation.Binary.PropositionalEquality
open import Size
-- Processes.
data Proc : Set where
ν_ : Proc → Proc
-- Actions.
data ⟿ᵇ : Set where
input : ⟿ᵇ
boundOut : ⟿ᵇ
data ⟿ᶜ : Set where
out : ⟿ᶜ
data ⟿ : Set where
_ᵇ : ⟿ᵇ → ⟿
_ᶜ : ⟿ᶜ → ⟿
-- Renamings.
data Ren : Set where
postulate
push : Ren
swap : Ren
_ᴬ*_ : Ren → ⟿ᶜ → ⟿ᶜ
-- Transitions.
data _—[_]→_ : {ι : Size} → Proc → (a : ⟿) → Proc → Set where
ν•_ : ∀ {ι P R} → _—[_]→_ {ι = ι} P (out ᶜ) R →
_—[_]→_ {ι = ↑ ι} (ν P) (boundOut ᵇ) R
νᵇ_ : ∀ {ι P R} {a : ⟿ᵇ} → _—[_]→_ {ι = ι} P (boundOut ᵇ) R →
_—[_]→_ {ι = ↑ ι} (ν P) (a ᵇ) (ν R)
νᶜ_ : ∀ {ι P R} → _—[_]→_ {ι = ι} P ((push ᴬ* out) ᶜ) R →
_—[_]→_ {ι = ↑ ι} (ν P) (out ᶜ) (ν R)
infixl 0 _—[_]→_
postulate
_ᴾ*_ : Ren → Proc → Proc
_ᵀ*_ : ∀ {ι} (ρ : Ren) {P R} {a : ⟿ᶜ} → _—[_]→_ {ι = ι} P (a ᶜ) R →
_—[_]→_ {ι = ι} (ρ ᴾ* P) ((ρ ᴬ* a) ᶜ) (ρ ᴾ* R)
swap-involutive : ∀ (P : Proc) → swap ᴾ* swap ᴾ* P ≡ P
swap∘push : swap ᴬ* push ᴬ* out ≡ out
infixr 8 _ᵀ*_ _ᴾ*_ _ᴬ*_
-- Structural congruence.
infix 4 _≅_
data _≅_ : Proc → Proc → Set where
νν-swap : ∀ P → ν (ν (swap ᴾ* P)) ≅ ν (ν P)
Now here's what I can't make work.
-- "Residual" of a transition E after a structural congruence φ.
⊖ : ∀ {ι P P′} {a : ⟿} {R} (E : _—[_]→_ {ι = ι} P a R) (φ : P ≅ P′) →
Σ[ R ∈ Proc ] _—[_]→_ {ι = ι} P′ a R
⊖ (ν•_ (νᶜ E)) (νν-swap P) with swap ᵀ* E
... | swap*E rewrite swap-involutive P | swap∘push =
_ , {!!} -- νᵇ (ν• swap*E)
⊖ E φ = {!!}
Roughly, I'm matching on the situation where there are adjacent ν binders, and showing that if I transpose the binders (by applying the 'swap' renaming under the binders) then the associated steps in the derivation also tranpose. Intuitively this preserves the size of the transition derivation.
Toggling hidden arguments (in Emacs) reveals that the goal in the problematic clause has type _—[_]→_ {↑ (↑ .ι)}, so I expect to be able to apply two constructors (in this case νᵇ and ν•). I can also see that E has type _—[_]→_ {.ι}, as does swap*E, and so I (naively) expect νᵇ (ν• swap*E) to be size-consistent with the goal. However Agda complains that the constraints are inconsistent.
Weirdly, if I use a with clause to introduce ν• swap*E into the context, then I get the following error:
.ι !=< P of type Size
when checking that the expression E has type
swap ᴾ* P —[ (push ᴬ* out) ᶜ ]→ .R
This is baffling because the choice of meta-variable P suggests that Agda is trying to match a size index against a variable of type Proc.
What am I doing wrong here?
Thanks to Andrea Vezzosi for answering this on the Agda mailing list. In this instance it's as simple as passing the ι index explicitly:
⊖ (ν• (νᶜ_ {ι} E)) (νν-swap P) with swap ᵀ* E
... | swap*E rewrite swap-involutive P | swap∘push
= _ , νᵇ (ν•_ {ι = ι} swap*E)
Turns out this was a bug which was fixed in Agda 2.4.0.2. One can now simply write:
⊖ (ν• (νᶜ E)) (νν-swap P) with swap ᵀ* E
... | swap*E rewrite swap-involutive P | swap∘push
= _ , νᵇ (ν• swap*E)
as one would expect.

Related Links

Why not have a termination function built into python that can have parameters it's set by the code
Proving equivalence of well-founded recursion
Unsolvable size constraints
Eclipse Luna marketplace
Termination check on unionWith
Agda: Equivalence relation for sub-colists

Categories

HOME
gerrit
netsuite
isabelle
google-play
office365api
cplex
yahoo-oauth
analysis
spring-jdbc
infragistics
v8
gps
upload
medical
iggrid
dacpac
izpack
offline
row
resize
spring-tool-suite
designer
telephony
facebook-page
object-detection
xlsxwriter
scriptcs
abi
graphicsmagick
wijmo
firebase-crash-reporting
smb
entitlements
assistant
saas
windows-server-2000
webkitspeechrecognition
tasklet
gsmcomm
functor
pdb
amazon-kinesis-kpl
mapbox-gl
environment-modules
libvpx
squib
ws-security
eclipse-scout
google-closure
heightmap
wptoolkit
qwt
jedis
hendrix
python-webbrowser
recursive-datastructures
nativeapplication
csound
python-cryptography
spring-mongodb
titanium-android
dwscript
synchronous
smart-table
httplistener
measures
paypal-express
firebaseui
rhino-servicebus
energy
hsv
kendonumerictextbox
msys
cannon.js
wordml
spidermonkey
iis-arr
browser-bugs
unity3d-gui
remobjects
issuu
monomac
ccss
quantlib-swig
gridfs
dotnetnuke-5
qt-faststart
sublist
cinema-4d
android-sdk-2.1
sql-server-profiler
dbal
database-management
meego
zend-tool
javap
xetex
yagni
rtml
misv

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App