If a list is a term then it must be a compound term. What, then is its principal functor? Predicates have a fixed arity but lists can be any length ---so what is the arity of the principle functor?
For the moment only, let us suppose we have a gluing agent which glues an element onto the front of a list. We know this is a reasonable supposition because we already have a list destructor/constructor that works like this.
[a,b,c,d] = [HeadTail]---results in Head=a, Tail=[b,c,d]
We might think of this constructor as a predicate cons/2. We have to build lists like this. Note, however, that there is no built-in predicate named cons/2 ---the real name for the list constructor function is ./2!
In Prolog, the empty list is represented as []. In some implementations, the empty list is named ``nil'' ---but the Prolog you will use does not use this name.
Now to represent the lists as trees ---but we will distort them a little:
You will have noticed that we could have written cons where we have written . ---well, remember that Prolog doesn't use a meaningful name for the constructor cons/2. Really, the constructor is ./2. For (textual) explanation purposes, we shall stick to using cons/2.
Now we will show how to unpack the structure of a non-flat list. We do this by building up the structure from left to right.
[a,[b,c],d]As this is difficult to read, we construct a tree using the method for drawing trees of compound terms.goes to
cons(a,[[b,c],d])
goes to
cons(a,cons([b,c],[d])
goes to
now [b,c] is cons(b,[c])
that is, cons(b,cons(c,[]))
cons(a,cons(cons(b,cons(c,[])),[d])
goes to
cons(a,cons(cons(b,cons(c,[])),cons(d,[])))