Choreographies are a way of describing communicating systems as global programs

```
let x@A = crunch()
let y@B = crunch()
A[x] -> B.x
B[y] -> A.y
```

```
let x@A = crunch()
let y@B = crunch()
A[x] -> B.x
B[y] -> A.y
```

A

```
x = crunch()
```

```
let x@A = crunch()
let y@B = crunch()
A[x] -> B.x
B[y] -> A.y
```

A

```
x = crunch()
```

B

```
y = crunch()
```

```
let x@A = crunch()
let y@B = crunch()
A[x] -> B.x
B[y] -> A.y
```

A

```
x = crunch()
send("A",x)
```

B

```
y = crunch()
x = receive("A")
```

```
let x@A = crunch()
let y@B = crunch()
A[x] -> B.x
B[y] -> A.y
```

A

```
x = crunch()
send("B",x)
y = receive("B")
```

B

```
y = crunch()
x = receive("A")
send("A",y)
```

Features

- Concurrency
- Asynchrony
- Confluence
- Deadlock-freedom

```
A[x] -> B.x
B[y] -> A.y
```

```
A[x] -> B.x
B[y] -> A.y
```

```
A[x] -> B.x
B[y] -> A.y
```

- Verified choreography compiler
- Published on ITP2022