As mentioned in chapter 3, all constants in LiLFeS are treated as TYPE. Also
predicates becomes subtype of pred. Alphanueric, whitespace, 2 byte characters
etc... can be used as strings, only quote needs to be delimited with '

Feature Name can be any string which is alphanumeric (valid characters are
alphanumeric, underscope, 2byte char). Like Type, strings within quotes can also
be used. it is necessary to add \ suffix. White space or newline character is
not allowed between the name and \.

Left hand side of <- is the new type. The right hand side can be
multiple supertypes separated by +. If the supertype is only one then [] can be
omitted (e.g., 1). It is possible to separate multiple types by comma (e.g.,
2). If feature are to be added, its priority can be omitted. if Type is
omitted it will be treated as bot. the order of features will be alphabetical if
priority is omitted. e.g., 3 it will be EMPLOYEE, EMPLOYER. In e.g., 4 it will
be TITLE, AUTHOR, PUBLISHER based on the priority specified.

module, module_interface, module_implementation etc. are predefined keywords and
are also referred to as directives, which can be used to write programs.

First the module name has to be specified in the file. The module name can be
anything, but the "/" in file path is to be converted to
":". For example, if LILFES_PATH is ~/lilfes/ Cand module is ~/lilfes/list/reverse.lil
then the module name will be list:reverse.

Next is the module_interface which
defines the global scope of the module. for example reverse predicate is
global. This can be accessed from other modules without module path i.e., list:reverse.

Finally
is the module_implementation which defines the local scope of the modules. In
order to view reverse_sub, the full path has to be specified such as
list:reverse:reverse_sub.

In order to use predicates from other modules,
use ensure_loaded directive to load the module. In the above example,
list:append module is loaded and all predicates defined in that module can be
used in this program. ensure_loaded can be used both in module_interface
or module_implementation.

List

Numeric

String

Don't care

variables starting with underscore (_) are treated as Don't care and
will always succeed in unification. Hence predicates which are not referred to
can be preceded by _ to ignore them. The unification part is exactly same as
trying to unify with bot.

Unification not possible cases

It is possible to allow unification not possible cases by using \= which
is opposite of = , and can be used when unification fails. Note,
the left hand side value and \= should have a white space. If there is no white
space, it will be treated as feature.