Exercise relationalgebra.cnf

Description
To conjunctive normal form

Strategy

<label name="tocnf">
  <let>
    <decl var="3">
      <orelse>
        <sequence>
          <orelse>
            <label name="step1">
              <let>
                <decl var="1">
                  <orelse>
                    <choice>
                      <rule name="relationalgebra.remcompl"/>
                      <rule name="relationalgebra.remredunexprs"/>
                      <rule name="relationalgebra.doublenegation"/>
                      <rule name="relationalgebra.idempotencyor"/>
                      <rule name="relationalgebra.idempotencyand"/>
                      <rule name="relationalgebra.absorp"/>
                      <rule name="relationalgebra.absorpcompl"/>
                      <rule name="relationalgebra.invoverunion"/>
                      <rule name="relationalgebra.invoverintersect"/>
                      <rule name="relationalgebra.invovercomp"/>
                      <rule name="relationalgebra.invoveradd"/>
                      <rule name="relationalgebra.invovernot"/>
                      <rule name="relationalgebra.doubleinv"/>
                      <fail/>
                    </choice>
                    <sequence>
                      <rule name="navigator.down"/>
                      <succeed/>
                      <let>
                        <decl var="2">
                          <choice>
                            <var var="1"/>
                            <sequence>
                              <rule name="navigator.right"/>
                              <succeed/>
                              <var var="2"/>
                            </sequence>
                          </choice>
                        </decl>
                        <var var="2"/>
                      </let>
                      <orelse>
                        <rule name="navigator.up"/>
                        <succeed/>
                      </orelse>
                    </sequence>
                  </orelse>
                </decl>
                <var var="1"/>
              </let>
            </label>
            <label name="step2">
              <let>
                <decl var="1">
                  <orelse>
                    <choice>
                      <rule name="relationalgebra.compoverunion"/>
                      <rule name="relationalgebra.addoverintersec"/>
                      <rule name="relationalgebra.demorganor"/>
                      <rule name="relationalgebra.demorganand"/>
                      <rule name="relationalgebra.notovercomp"/>
                      <rule name="relationalgebra.notoveradd"/>
                      <fail/>
                    </choice>
                    <sequence>
                      <rule name="navigator.down"/>
                      <succeed/>
                      <let>
                        <decl var="2">
                          <choice>
                            <var var="1"/>
                            <sequence>
                              <rule name="navigator.right"/>
                              <succeed/>
                              <var var="2"/>
                            </sequence>
                          </choice>
                        </decl>
                        <var var="2"/>
                      </let>
                      <orelse>
                        <rule name="navigator.up"/>
                        <succeed/>
                      </orelse>
                    </sequence>
                  </orelse>
                </decl>
                <var var="1"/>
              </let>
            </label>
            <label name="step3">
              <let>
                <decl var="1">
                  <choice>
                    <rule name="relationalgebra.unionoverintersec"/>
                    <sequence>
                      <rule name="navigator.down"/>
                      <succeed/>
                      <let>
                        <decl var="2">
                          <choice>
                            <var var="1"/>
                            <sequence>
                              <rule name="navigator.right"/>
                              <succeed/>
                              <var var="2"/>
                            </sequence>
                          </choice>
                        </decl>
                        <var var="2"/>
                      </let>
                      <orelse>
                        <rule name="navigator.up"/>
                        <succeed/>
                      </orelse>
                    </sequence>
                  </choice>
                </decl>
                <var var="1"/>
              </let>
            </label>
          </orelse>
          <var var="3"/>
        </sequence>
        <succeed/>
      </orelse>
    </decl>
    <var var="3"/>
  </let>
</label>

Locations

LocationLabel
[]tocnf
[0]...step1
[0,0]......relationalgebra.remcompl
[1,0]......relationalgebra.remredunexprs
[2,0]......relationalgebra.doublenegation
[3,0]......relationalgebra.idempotencyor
[4,0]......relationalgebra.idempotencyand
[5,0]......relationalgebra.absorp
[6,0]......relationalgebra.absorpcompl
[7,0]......relationalgebra.invoverunion
[8,0]......relationalgebra.invoverintersect
[9,0]......relationalgebra.invovercomp
[10,0]......relationalgebra.invoveradd
[11,0]......relationalgebra.invovernot
[12,0]......relationalgebra.doubleinv
[1]...step2
[0,1]......relationalgebra.compoverunion
[1,1]......relationalgebra.addoverintersec
[2,1]......relationalgebra.demorganor
[3,1]......relationalgebra.demorganand
[4,1]......relationalgebra.notovercomp
[5,1]......relationalgebra.notoveradd
[2]...step3
[0,2]......relationalgebra.unionoverintersec