This example is a formal proof of the equivalence of the following
two while programs:

while B do {
  p;
  while C do q
}

if B then {
  p;
  while B + C do {
    if C then q else p
  }
}

which demonstrates how while loops can be denested.  This example is
from Sec. 3.4 of

Dexter Kozen. Kleene algebra with tests.
Transactions on Programming Languages and Systems,
May 1997, 427-443.

The formal proof below follows the proof in the cited article exactly.
Note the application of the KA denesting rule x*;(y;x*)* = (x + y)*
at the very last step.

======================================================================

>pub (B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B
L0: (B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B  (1 task)

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B

>focus

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B
-------------------

>r d d d d r r d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;((B + C);(C;q + ~C;p))*;~(B + C) + ~B
                           --------------------

>cite distrR l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;(C;q + ~C;p) + C;(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;(C;q + ~C;p) + C;(C;q + ~C;p))*;~(B + C) + ~B
                           -------------------------------

>d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;(C;q + ~C;p) + C;(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;(C;q + ~C;p) + C;(C;q + ~C;p))*;~(B + C) + ~B
                           --------------

>cite distrL l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;(C;q + ~C;p))*;~(B + C) + ~B
                           --------------

>r d r

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;(C;q + ~C;p))*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;(C;q + ~C;p))*;~(B + C) + ~B
                                            --------------

>cite distrL l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;C;q + C;~C;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;C;q + C;~C;p)*;~(B + C) + ~B
                                            --------------

>d d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;C;q + C;~C;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;C;q + C;~C;p)*;~(B + C) + ~B
                                            ---

>cite idemp. l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + C;~C;p)*;~(B + C) + ~B


(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + C;~C;p)*;~(B + C) + ~B
                                            -

>u r d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + C;~C;p)*;~(B + C) + ~B


(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + C;~C;p)*;~(B + C) + ~B
                                                  ----

>cite compl. l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0;p)*;~(B + C) + ~B
                                                  -

>u

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0;p)*;~(B + C) + ~B
                                                  ---

>cite annihL l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0)*;~(B + C) + ~B
                                                  -

>l u

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q + 0)*;~(B + C) + ~B
                                            -------

>cite id+R l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + C;q)*;~(B + C) + ~B
                                            ---

>cite id.L r

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + 1;C;q)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + 1;C;q)*;~(B + C) + ~B
                                            -----

>l d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + 1;C;q)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + B;~C;p + 1;C;q)*;~(B + C) + ~B
                                   ----

>cite commut. l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + ~C;B;p + 1;C;q)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + ~C;B;p + 1;C;q)*;~(B + C) + ~B
                                   ----

>u u

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + ~C;B;p + 1;C;q)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + ~C;B;p + 1;C;q)*;~(B + C) + ~B
                                   --------------

>cite commut+ l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + 1;C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + 1;C;q + ~C;B;p)*;~(B + C) + ~B
                                   --------------

>l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + 1;C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(B;C;q + 1;C;q + ~C;B;p)*;~(B + C) + ~B
                           -------------

>cite distrR r
ambiguous unification
specify desired bindings by number:

0: [ x=B y=1 z=C;q ]
1: [ x=B;C y=1;C z=q ]
? 0

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;((B + 1);C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;((B + 1);C;q + ~C;B;p)*;~(B + C) + ~B
                           -----------

>d d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;((B + 1);C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;((B + 1);C;q + ~C;B;p)*;~(B + C) + ~B
                           -------

>cite <1 l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(1;C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(1;C;q + ~C;B;p)*;~(B + C) + ~B
                           -

>u

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(1;C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(1;C;q + ~C;B;p)*;~(B + C) + ~B
                           ---

>cite id.L l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~(B + C) + ~B
                           -

>u u u r

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~(B + C) + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~(B + C) + ~B
                                          --------

>cite deMorgan+ l

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
                                          -----

>u u l d

current task:
T0:  |- (B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
----------------

>cite unwindL r

current task:
T0:  |- (1 + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*);~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B


(1 + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*);~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
------------------------------------

>u

current task:
T0:  |- (1 + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*);~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B


(1 + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*);~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
---------------------------------------

>cite distrR l

current task:
T0:  |- 1;~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

1;~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
----------------------------------------

>d

current task:
T0:  |- 1;~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

1;~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
----

>cite id.L l

current task:
T0:  |- ~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
--

>r d r d r d r d

current task:
T0:  |- ~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

~B + B;p;(C;q)*;~C;(B;p;(C;q)*;~C)*;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
                -------------------

>cite slide l

current task:
T0:  |- ~B + B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

~B + B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
                -------------------

>u u u

current task:
T0:  |- ~B + B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

~B + B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
--------------------------------------

>cite commut+ l

current task:
T0:  |- B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B + ~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B + ~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B
--------------------------------------

>unf

current task:
T0:  |- B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B + ~B = B;p;(C;q + ~C;B;p)*;~B;~C + ~B

>cite cong+R

current task:
T0:  |- B;p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = B;p;(C;q + ~C;B;p)*;~B;~C

>cite cong.L
ambiguous unification
specify desired bindings by number:

0: [ x=B y=p;(C;q)*;(~C;B;p;(C;q)*)*;~C;~B z=p;(C;q + ~C;B;p)*;~B;~C ]
1: [ x=B;p y=(C;q)*;(~C;B;p;(C;q)*)*;~C;~B z=(C;q + ~C;B;p)*;~B;~C ]
? 1

current task:
T1:  |- (C;q)*;(~C;B;p;(C;q)*)*;~C;~B = (C;q + ~C;B;p)*;~B;~C

>foc

current task:
T1:  |- (C;q)*;(~C;B;p;(C;q)*)*;~C;~B = (C;q + ~C;B;p)*;~B;~C

(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = (C;q + ~C;B;p)*;~B;~C
-----------------------------

>d r d r

current task:
T1:  |- (C;q)*;(~C;B;p;(C;q)*)*;~C;~B = (C;q + ~C;B;p)*;~B;~C

(C;q)*;(~C;B;p;(C;q)*)*;~C;~B = (C;q + ~C;B;p)*;~B;~C
                        -----

>cite commut. l

current task:
T1:  |- (C;q)*;(~C;B;p;(C;q)*)*;~B;~C = (C;q + ~C;B;p)*;~B;~C

(C;q)*;(~C;B;p;(C;q)*)*;~B;~C = (C;q + ~C;B;p)*;~B;~C
                        -----

>unf

current task:
T1:  |- (C;q)*;(~C;B;p;(C;q)*)*;~B;~C = (C;q + ~C;B;p)*;~B;~C

>cite cong.R
ambiguous unification
specify desired bindings by number:

0: [ x=(C;q)*;(~C;B;p;(C;q)*)* y=(C;q + ~C;B;p)* z=~B;~C ]
1: [ x=(C;q)*;(~C;B;p;(C;q)*)*;~B y=(C;q + ~C;B;p)*;~B z=~C ]
? 0

current task:
T2:  |- (C;q)*;(~C;B;p;(C;q)*)* = (C;q + ~C;B;p)*

>cite denest
task completed

no tasks

>
