summaryrefslogtreecommitdiff
path: root/repcore/src/plan.org
blob: 13c2ee04c1266374f24f7dfdf193542a435a43ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#+TITLE: Plan of the package
#+AUTHOR: Durand
#+DATE: <2022-11-18 Ven 19:57>

* Atomic Languages

This describes the behaviours of atomic languages.  The atomic
language consists of the null closure of any non-terminal symbol in
the grammar, and their deriavtives by terminals and non-terminal.

* Derivative Languages

This is the main driving device of the algorithm.  Basically, the
algorithm works by taking successive derivatives, according to the
input symbol.  At each step, we calculate the derivative language.  In
this process, we also compute some semiring value and store in a
carrier.  The end result of the algorithm is the final semiring
value.

If one wants simply to determine if the input string belongs to the
grammar, one chooses the semiring to be the field with two elements,
the boolean field.  If one wants to find how many ways are there to
derive a given input string, then one uses the semiring of natural
numbers instead.  If one wants, moreover, to find all the possible
ways to derive a particular input string, then one can use the
free semiring on the set of terminals and non-terminals of the
grammar.  Here the free semiring is the left-adjoint functor to the
forgetful functor from the category of semirings to the category of
sets.

To be more specific, the free semiring on a set is given by sets of
sequences of elements in the set.  The addition of the semiring is the
set union operation, and the multiplication is taking the respective
concatenations.

** Semirings

So we need a module to define the behaviours of semirings, and provide
some common semirings implementations.  Then in the main driving force
we can freely substitute different semirings, according to the
particular needs.

** Languages

Then the main part is to define the behaviour of languages.  This
should be easy enough, since we already have the mechanism of graphs,
nondeterministic automata, and semirings.  All we need to do is to
combine them together.

* Testing ground

I am in a strong need to test things out.  The most important one is
to visualize each step of the derivation, in a human-friendly manner.
I need this to examine whether my atomic languages are wrongly
implemented, or my atomic languages are wrongly derived, or my
understanding of the main algorithm is plain wrong.

This is the main reason I started this rewrite of the package.