Hi Doug,
> I keep going back and forth on that, trying to think of a terse syntax
> that will accommodate all the cases :-/
Idea: You could make the body _atomic_ for terminal facts.
With that, the syntax of the previous version
(dcg noun [cat])
would become
(dcg noun . cat)
For non-terminals, you'd have two syntax variants:
The first one is as before
(dcg foo mumble bar)
which expands to
(be foo ("@In" "@Out")
(mumble "@In" "@1")
(bar "@1" "@Out") )
and the second one
(dcg foo (@A) (mumble) (bar @A))
which expands to
(be foo (@A "@In" "@Out")
(mumble "@In" "@1")
(bar @A "@1" "@Out") )
This syntax can be handled with
(de dcg CL
(clause
(if (atom (cdr CL))
(list
(car CL)
(list (cons (cdr CL) '"@A") '"@A") )
(if (atom (cadr CL))
(cons
(car CL)
'("@In" "@Out")
(let Vars
(make
(link "@In")
(for (I . @) (cddr CL)
(link (pack "@" I)) )
(link "@Out") )
(mapcar list (cdr CL) Vars (cdr Vars)) ) )
(cons
(car CL)
(append (cadr CL) '("@In" "@Out"))
(let Vars
(make
(link "@In")
(for (I . @) (cdddr CL)
(link (pack "@" I)) )
(link "@Out") )
(mapcar
'((L V1 V2)
(append L (cons V1) (cons V2)) )
(cddr CL)
Vars
(cdr Vars) ) ) ) ) ) ) )
The previous examples would then be:
(dcg sentence nounPhrase verbPhrase)
(dcg nounPhrase det noun)
(dcg verbPhrase verb nounPhrase)
(dcg det . the)
(dcg det . a)
(dcg noun . cat)
(dcg noun . bat)
(dcg verb . eats)
Cheers,
- Alex
--
UNSUBSCRIBE: mailto:[email protected]?subject=Unsubscribe