20
Introduction Synthesis Conclusion Coinductive Program Synthesis for the Masses Excerpt of: Higher-Order Causal Stream Functions in SIG from First Principles . Baltasar Trancón y Widemann 12 Markus Lepper 2 1 Ilmenau University of Technology 2 semantics GmbH, Berlin CMCS Short Talk 2016-04-02//03 <semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 1 / 12 Coinductive Program Synthesis for the Masses Excerpt of: Higher-Order Causal Stream Functions in SIG from First Principles . Baltasar Trancón y Widemann12 Markus Lepper2 1 Ilmenau University of Technology 2 semantics GmbH, Berlin CMCS Short Talk 2016-04-02//03 2016-04-05 Coind. Prog. Synth. 1 / 12

Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Coinductive Program Synthesisfor the Masses

Excerpt of: Higher-Order Causal Stream Functions in SIGfrom First Principles

. Baltasar Trancón y Widemann12 Markus Lepper2

1 Ilmenau University of Technology

2 semantics GmbH, Berlin

CMCS Short Talk2016-04-02//03

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 1 / 12

Coinductive Program Synthesisfor the Masses

Excerpt of: Higher-Order Causal Stream Functions in SIGfrom First Principles

. Baltasar Trancón y Widemann12 Markus Lepper2

1 Ilmenau University of Technology

2 semantics GmbH, Berlin

CMCS Short Talk2016-04-02//0320

16-0

4-05

Coind. Prog. Synth. 1 / 12

Page 2: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

History

CMCS 2014 – Coinduction goes BLING!

Demonstration of SIG programming language

Online purely functional stream processing

Simple & useful coalgebraic semantics

FARM 2014 – The Soundtrack Improves

[Demo]

Efficient low-level code generated (via Java JIT)

Semantics congruent to low-level programmer lore

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 2 / 12

History

CMCS 2014 – Coinduction goes BLING!

Demonstration of SIG programming language

Online purely functional stream processing

Simple & useful coalgebraic semantics

FARM 2014 – The Soundtrack Improves

[Demo]

Efficient low-level code generated (via Java JIT)

Semantics congruent to low-level programmer lore2016

-04-

05Coind. Prog. Synth. 2 / 12

Introduction

History

• Demo: first bars of Toccata in d-minor, BWV 565

• Played on SIG software synthesizer, fully computational (nowave tables), real time, CD quality, four octaves fullypolyphonic— 49× 44 100 samples per second, using 20%–25%of a single CPU core.

• Shows out-of-the box scalability; compare functional reactiveprogramming! Plausible reasons both technical and formal.

• This talk is to argue that the last statement is true, deep andinteresting.

Page 3: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Streams Coalgebraically [CP1998]

Generator coalgebra (X, f) of functor SAX = A× XStreams final coalgebra (Aω, φ = 〈headA, tailA〉)

Semantics anamorphism [(f)] : X→ Aω, namely

[(〈h, t〉)](x)n = h(tn(x)

)Intuition (body of) infinite loop with state & output

More powerful than classical sequences & recurrencerelations

unobservable stateexample: random number generators

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 3 / 12

Streams Coalgebraically [CP1998]

Generator coalgebra (X, f) of functor SAX = A× XStreams final coalgebra (Aω, φ = 〈headA, tailA〉)

Semantics anamorphism [(f)] : X→ Aω, namely

[(〈h, t〉)](x)n = h(tn(x)

)Intuition (body of) infinite loop with state & output

More powerful than classical sequences & recurrencerelations

unobservable stateexample: random number generators20

16-0

4-05

Coind. Prog. Synth. 3 / 12Introduction

Streams Coalgebraically [CP1998]

• Last observation redundant for coalgebra audience, but founduseful in teaching.

Page 4: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Illustration

c© campusgantha.com

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 4 / 12

Illustration

c© campusgantha.com2016

-04-

05Coind. Prog. Synth. 4 / 12

Introduction

Illustration

Page 5: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Illustration

c© campusgantha.com

[(〈!, succ〉)]

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 4 / 12

Illustration

c© campusgantha.com

[(〈!, succ〉)]20

16-0

4-05

Coind. Prog. Synth. 4 / 12Introduction

Illustration

Page 6: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Stream Processing Coalgebraically

Mealy Transducer coalgebra (X, f) of functor TAB = (B× X)A

Stream Functions final coalg. (A ω B, φ = · · · )

by construction restricted to causal functions

A ω B =

{f : Aω → Bω

∣∣ x<n = y<n =⇒ f(x)<n = f(y)<n}

. Index makes sense as (real) global time

Semantics anamorphism [(f)] : X→ A ω B, namely

[(〈h, t〉)](x)(s)n = h(t(· · · t(x)(s0) · · ·

)(sn−1)

)(sn)

Intuition (body of) infinite loop with state, input & output

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 5 / 12

Stream Processing Coalgebraically

Mealy Transducer coalgebra (X, f) of functor TAB = (B× X)A

Stream Functions final coalg. (A ω B, φ = · · · )

by construction restricted to causal functions

A ω B =

{f : Aω → Bω

∣∣ x<n = y<n =⇒ f(x)<n = f(y)<n}

. Index makes sense as (real) global time

Semantics anamorphism [(f)] : X→ A ω B, namely

[(〈h, t〉)](x)(s)n = h(t(· · · t(x)(s0) · · ·

)(sn−1)

)(sn)

Intuition (body of) infinite loop with state, input & output

2016

-04-

05Coind. Prog. Synth. 5 / 12

Introduction

Stream Processing Coalgebraically

• Simply add input in the right places.

Page 7: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Coinductive Stream Functions in SIG

ra0

x

b0

x′

I/O (public)

State (private)

λr : X× A→ B× X

[(λr)] : X→ A ω B

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 6 / 12

Coinductive Stream Functions in SIG

ra0

x

b0

x′

I/O (public)

State (private)

λr : X× A→ B× X

[(λr)] : X→ A ω B

2016

-04-

05Coind. Prog. Synth. 6 / 12

Introduction

Coinductive Stream Functions in SIG

• Side remark: right currying to A→ X→ B× X would set thestage for the Kleisli category of a state monad instead.

Page 8: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Coinductive Stream Functions in SIG

ra0

x

b0

r

r

a1 b1

a2 b2

...

I/O (public)

State (private)

λr : X× A→ B× X

[(λr)] : X→ A ω B

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 6 / 12

Coinductive Stream Functions in SIG

ra0

x

b0

r

r

a1 b1

a2 b2

...

I/O (public)

State (private)

λr : X× A→ B× X

[(λr)] : X→ A ω B

2016

-04-

05Coind. Prog. Synth. 6 / 12

Introduction

Coinductive Stream Functions in SIG

• Side remark: right currying to A→ X→ B× X would set thestage for the Kleisli category of a state monad instead.

• Virtual ω-replication of data-flow network; clearly shows stateprivacy & causality.

Page 9: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Cui Bono?

Uses of Semantics in Programming Proper

descriptive explicate what code can mean

prescriptive propose code that really means it

Prescription Recipe

1 Choose a causal stream function h : A ω B

2 Find corecursive definition, φ ◦ h = · · ·h · · ·3 Assume h is anamorphism, h = [(λr)]4 Calculate transducer (X, r : X× A→ B× X)

1 Educatedly guess carrier X (type inference helps)2 Solve anamorphism equation for r, canonically

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 7 / 12

Cui Bono?

Uses of Semantics in Programming Proper

descriptive explicate what code can mean

prescriptive propose code that really means it

Prescription Recipe

1 Choose a causal stream function h : A ω B

2 Find corecursive definition, φ ◦ h = · · ·h · · ·3 Assume h is anamorphism, h = [(λr)]4 Calculate transducer (X, r : X× A→ B× X)

1 Educatedly guess carrier X (type inference helps)2 Solve anamorphism equation for r, canonically20

16-0

4-05

Coind. Prog. Synth. 7 / 12Synthesis

Cui Bono?

• Treatment in SIG papers so far descriptive; here prescriptive.

Page 10: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

φ ◦ p = TAA p ◦ λδ

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 8 / 12

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

φ ◦ p = TAA p ◦ λδ

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)20

16-0

4-05

Coind. Prog. Synth. 8 / 12Synthesis

Example: Single-Step Delay

Page 11: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

φ(p(a0)

)(a1) = TAA p

(λδ(a0)

)(a1)

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 8 / 12

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

φ(p(a0)

)(a1) = TAA p

(λδ(a0)

)(a1)

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)20

16-0

4-05

Coind. Prog. Synth. 8 / 12Synthesis

Example: Single-Step Delay

Page 12: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)](

a0,p(a1))= (idA × p)

(δ(a0, a1)

)4 Calculate transducer (X, δ : X× A→ A× X)

1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 8 / 12

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)](

a0,p(a1))= (idA × p)

(δ(a0, a1)

)4 Calculate transducer (X, δ : X× A→ A× X)

1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)20

16-0

4-05

Coind. Prog. Synth. 8 / 12Synthesis

Example: Single-Step Delay

Page 13: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

⇐= idA×A = δ

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 8 / 12

Example: Single-Step Delay

1 Prepend initial value, p : A→ A ω A with p(a)(s) = a ; s

2 Corecursive definitionφ(p(a0)

)(a1) = (a0,p(a1)

)3 Assume p is anamorphism, p = [(λδ)]

⇐= idA×A = δ

4 Calculate transducer (X, δ : X× A→ A× X)1 Deduce carrier X = A2 Solve anamorphism equation canonically

first projection of δ is π1

second projection of δ is π2 up to kerp(btw p is mono)20

16-0

4-05

Coind. Prog. Synth. 8 / 12Synthesis

Example: Single-Step Delay

Page 14: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Delay, Graphically

δ δ

Programmer concerned with IO flow only

State flow is inferred from delayidA×A = idA × idA

Independent identities =⇒ delayed cycles vanish

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 9 / 12

Delay, Graphically

δ δ

Programmer concerned with IO flow only

State flow is inferred from delayidA×A = idA × idA

Independent identities =⇒ delayed cycles vanish

2016

-04-

05Coind. Prog. Synth. 9 / 12

Synthesis

Delay, Graphically

Page 15: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Random Number Generator

Marsaglia’s xorshift128

SIG Code[ −> r

wherer := (x ^<< a ^>> b) ^ (w ^>> c)x := s0 ; s1 ; s2 ; ww := s3 ; r

]

C Code (Marsaglia 2003)tmp = (x^(x<<a)); x = y; y = z; z = w;return w = (w^(w>>c)) ^ (tmp^(tmp>>b));

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 10 / 12

Example: Random Number Generator

Marsaglia’s xorshift128

SIG Code[ −> r

wherer := (x ^<< a ^>> b) ^ (w ^>> c)x := s0 ; s1 ; s2 ; ww := s3 ; r

]

C Code (Marsaglia 2003)tmp = (x^(x<<a)); x = y; y = z; z = w;return w = (w^(w>>c)) ^ (tmp^(tmp>>b));20

16-0

4-05

Coind. Prog. Synth. 10 / 12Synthesis

Example: Random Number Generator

• SIG code is referentially transparent; system of let-equations.

• C code is destructive assignments.

• Parameters a,b, c are from table of suggestions.

• Elements s0, . . . , s3 are random seed.

Page 16: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Random Number Generator

Marsaglia’s xorshift128

δ

δ

δ

δ

⇐a ⇒b

⇒c

⊕r

x

w

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 10 / 12

Example: Random Number Generator

Marsaglia’s xorshift128

δ

δ

δ

δ

⇐a ⇒b

⇒c

⊕r

x

w

2016

-04-

05Coind. Prog. Synth. 10 / 12

Synthesis

Example: Random Number Generator

• Now allocate state and eliminate delay.

Page 17: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Example: Random Number Generator

Marsaglia’s xorshift128

⇐a ⇒b

⇒c

⊕ r

wzyx

w′z′y′x′

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 10 / 12

Example: Random Number Generator

Marsaglia’s xorshift128

⇐a ⇒b

⇒c

⊕ r

wzyx

w′z′y′x′2016

-04-

05Coind. Prog. Synth. 10 / 12

Synthesis

Example: Random Number Generator

• Result: data-flow network; straightforward code generationgets just as good as C version.

Page 18: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

Summary and Outlook

Calculate sub-automata for primitive stream operationshere: delayalso: par/synch/switch composition, apply [TL2016]

Find canonical (most obvious) solution of anamorphismequation

Reverse-engineer C hacker skills in formal setting

Open questions:1 can uncanonical solutions be more efficient?2 synthesize non-primitive computations? [HR2010]3 find corecursive defs with computer aid?4 teach coalgebra as hands-on compiler stuff?

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 11 / 12

Summary and Outlook

Calculate sub-automata for primitive stream operationshere: delayalso: par/synch/switch composition, apply [TL2016]

Find canonical (most obvious) solution of anamorphismequation

Reverse-engineer C hacker skills in formal setting

Open questions:1 can uncanonical solutions be more efficient?2 synthesize non-primitive computations? [HR2010]3 find corecursive defs with computer aid?4 teach coalgebra as hands-on compiler stuff?20

16-0

4-05

Coind. Prog. Synth. 11 / 12Conclusion

Summary and Outlook

Page 19: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Introduction Synthesis Conclusion

The End

Just doin’ my coinduction exercises – ain’t so bad folks!

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 12 / 12

The End

Just doin’ my coinduction exercises – ain’t so bad folks!2016

-04-

05Coind. Prog. Synth. 12 / 12

Conclusion

The End

Page 20: Coinductive Program Synthesis for the Masses · Streams Coalgebraically [CP1998] Generator coalgebra (X;f) of functor S AX = A X Streams final coalgebra (A!;˚= hhead A;tail Ai)

Bibliography

Caspi, P. and M. Pouzet (1998). “A Co-iterative Characterizationof Synchronous Stream Functions”. In: Electronic Notes inTheoretical Computer Science 11, pp. 1–21. DOI:10.1016/S1571-0661(04)00050-7.

Hansen, H. H. and J. J. M. M. Rutten (2010). “SymbolicSynthesis of Mealy Machines from Arithmetic BitstreamFunctions”. In: Sci. Ann. Comp. Sci. 20, pp. 97–130. URL:http://www.infoiasi.ro/bin/Annals/Article?v=XX&a=3.

Marsaglia, G. (2003). “Xorshift RNGs”. In: Journal of StatisticalSoftware 8.14. DOI: 10.18637/jss.v008.i14.

Trancón y Widemann, B. and M. Lepper (2016). “Higher-OrderCausal Stream Functions in Sig from First Principles”. In:Proceedings Software Engineering Workshops (SE-WS 2016).CEUR Workshop Proceedings, pp. 25–39. URL:http://ceur-ws.org/Vol-1559/paper03.pdf.

<semantics /> Trancón y Widemann, Lepper Coind. Prog. Synth. 13 / 12

Bibliography

Caspi, P. and M. Pouzet (1998). “A Co-iterative Characterizationof Synchronous Stream Functions”. In: Electronic Notes inTheoretical Computer Science 11, pp. 1–21. DOI:10.1016/S1571-0661(04)00050-7.

Hansen, H. H. and J. J. M. M. Rutten (2010). “SymbolicSynthesis of Mealy Machines from Arithmetic BitstreamFunctions”. In: Sci. Ann. Comp. Sci. 20, pp. 97–130. URL:http://www.infoiasi.ro/bin/Annals/Article?v=XX&a=3.

Marsaglia, G. (2003). “Xorshift RNGs”. In: Journal of StatisticalSoftware 8.14. DOI: 10.18637/jss.v008.i14.

Trancón y Widemann, B. and M. Lepper (2016). “Higher-OrderCausal Stream Functions in Sig from First Principles”. In:Proceedings Software Engineering Workshops (SE-WS 2016).CEUR Workshop Proceedings, pp. 25–39. URL:http://ceur-ws.org/Vol-1559/paper03.pdf.

2016

-04-

05Coind. Prog. Synth. 13 / 12

Bibliography