Rewrite

[1]:
from lambeq.backend.grammar import Cup, Diagram, Id, Word
from lambeq.backend.drawing import draw

from lambeq import AtomicType

N = AtomicType.NOUN
S = AtomicType.SENTENCE
[2]:
from lambeq import Rewriter

rewriter = Rewriter()

Auxiliary rule

[3]:
diagram = ((Word('we', N) @ Word('will', (N >> S) << (N >> S)) @
            Word('go', N >> S)) >>
           Cup(N, N.r) @ Id(S) @ Diagram.cups((N >> S).l, N >> S))

draw(diagram)
print('↓ rewriting (auxiliary rule)')
draw(Rewriter(['auxiliary'])(diagram))
print('↓ normal form')
draw(rewriter(diagram).normal_form())
../_images/examples_rewrite_4_0.png
↓ rewriting (auxiliary rule)
../_images/examples_rewrite_4_2.png
↓ normal form
../_images/examples_rewrite_4_4.png

Connector rule

[4]:
diagram = ((Word('I', N) @ Word('hope', N >> S << S) @
            Word('that', S << S) @ Word('this', N) @
            Word('succeeds', N >> S)) >>
           (Cup(N, N.r) @ Id(S) @ Cup(S.l, S) @
            Diagram.cups((N >> S).l, N >> S)))

draw(diagram)
print('↓ rewriting (connector rule)')
Rewriter(['connector'])(diagram).draw()
print('↓ normal form')
rewriter(diagram).normal_form().draw()
../_images/examples_rewrite_6_0.png
↓ rewriting (connector rule)
../_images/examples_rewrite_6_2.png
↓ normal form
../_images/examples_rewrite_6_4.png

Determiner rule

[5]:
diagram = (Word('the', N << N) @ Word('book', N) >>
           Id(N) @ Cup(N.l, N))

draw(diagram)
print('↓ rewriting (determiner rule)')
draw(Rewriter(['determiner'])(diagram))
print('↓ normal form')
draw(rewriter(diagram).normal_form())
../_images/examples_rewrite_8_0.png
↓ rewriting (determiner rule)
../_images/examples_rewrite_8_2.png
↓ normal form
../_images/examples_rewrite_8_4.png
[6]:

Adverb rules

[7]:
cod = (N >> S) >> (N >> S)
diagram = (Word('we', N) @ Word('go', N >> S) @ Word('quickly', cod) >>
           Diagram.cups(cod[:3].l, cod[:3]) @ Id(S))

draw(diagram)
print('↓ rewriting (postadverb rule)')
draw(Rewriter(['postadverb'])(diagram))
print('↓ normal form')
draw(rewriter(diagram).normal_form())
../_images/examples_rewrite_11_0.png
↓ rewriting (postadverb rule)
../_images/examples_rewrite_11_2.png
↓ normal form
../_images/examples_rewrite_11_4.png
[8]:
diagram = ((Word('we', N) @ Word('quickly', (N >> S) << (N >> S)) @
            Word('go', N >> S)) >>
           Cup(N, N.r) @ Id(S) @ Diagram.cups((N >> S).l, N >> S))

draw(diagram)
print('↓ rewriting (preadverb rule)')
draw(Rewriter(['preadverb'])(diagram))
print('↓ normal form')
draw(rewriter(diagram).normal_form())
../_images/examples_rewrite_12_0.png
↓ rewriting (preadverb rule)
../_images/examples_rewrite_12_2.png
↓ normal form
../_images/examples_rewrite_12_4.png

Prepositional phrase rule

[9]:
cod = (N >> S) >> (N >> S << N)
diagram = ((Word('I', N) @ Word('go', N >> S) @ Word('to', cod) @
            Word('bed', N)) >>
           Diagram.cups(cod[:3].l, cod[:3]) @ Id(S) @ Cup(N.l, N))

draw(diagram)
print('↓ rewriting (prepositional phrase rule)')
draw(Rewriter(['prepositional_phrase'])(diagram))
print('↓ normal form')
draw(rewriter(diagram).normal_form())
../_images/examples_rewrite_14_0.png
↓ rewriting (prepositional phrase rule)
../_images/examples_rewrite_14_2.png
↓ normal form
../_images/examples_rewrite_14_4.png

Relative Pronoun rules

[10]:
cows = Word('cows', N)
that_subj = Word('that', N.r @ N @ S.l @ N)
that_obj = Word('that', N.r @ N @ N.l.l @ S.l)
eat = Word('eat', N >> S << N)
grass = Word('grass', N)

rewriter = Rewriter(['subject_rel_pronoun'])

diagram = Id().tensor(cows, that_subj, eat, grass)
diagram >>= Cup(N, N.r) @ Id(N) @ Diagram.cups(S.l @ N, N.r @ S) @ Cup(N.l, N)

draw(diagram)
print('↓ rewriting (subject relative pronoun rule)')
draw(Rewriter(['subject_rel_pronoun'])(diagram))
../_images/examples_rewrite_16_0.png
↓ rewriting (subject relative pronoun rule)
../_images/examples_rewrite_16_2.png
[11]:
diagram = Id().tensor(grass, that_obj, cows, eat)
diagram >>= Cup(N, N.r) @ Id(N) @ Id(N.l.l @ S.l) @ Cup(N, N.r) @ Id(S @ N.l)
diagram >>= Id(N) @ Diagram.cups(N.l.l @ S.l, S @ N.l)

draw(diagram)
print('↓ rewriting (object relative pronoun rule)')
draw(Rewriter(['object_rel_pronoun'])(diagram))
../_images/examples_rewrite_17_0.png
↓ rewriting (object relative pronoun rule)
../_images/examples_rewrite_17_2.png

Coordination

[12]:
diagram = (Word('eggs', N) @ Word('and', N >> N << N)
           @ Word('ham', N) >> Cup(N, N.r) @ Id(N) @ Cup(N.l, N))

draw(diagram)
print('↓ rewriting (coordination rule)')
draw(Rewriter(['coordination'])(diagram))
print('↓ normal form')
draw(Rewriter(['coordination'])(diagram).normal_form())
../_images/examples_rewrite_19_0.png
↓ rewriting (coordination rule)
../_images/examples_rewrite_19_2.png
↓ normal form
../_images/examples_rewrite_19_4.png

Remove cups

[13]:
from lambeq import RemoveCupsRewriter


diagram = (Word('I', N) @ Word('love', N >> S << N)
           @ Word('cheese', N) >> Cup(N, N.r) @ Id(S) @ Cup(N.l, N))
remove_cups = RemoveCupsRewriter()

draw(diagram)
print('↓ remove cups by bending wires')
remove_cups(diagram).draw()
../_images/examples_rewrite_21_0.png
↓ remove cups by bending wires
../_images/examples_rewrite_21_2.png

Curry functor

[14]:
rewriter = Rewriter(['curry'])

diagram = (
    Word('I', N) @ Word('see', N >> S << N) @
    Word('dead', N @ N.l) @ Word('people', N) >>
    Cup(N, N.r) @ Id(S) @ Cup(N.l, N) @ Cup(N.l, N)
)
draw(diagram)
print('↓ rewrite by using the map-state duality')
rewriter(diagram).draw()
print('↓ normal form')
rewriter(diagram).normal_form().draw()
../_images/examples_rewrite_23_0.png
↓ rewrite by using the map-state duality
../_images/examples_rewrite_23_2.png
↓ normal form
../_images/examples_rewrite_23_4.png