Did you know ... Search Documentation:
Packs (add-ons) for SWI-Prolog

Package "edcg"

Title:Extended DCG
Rating:Not rated. Create the first rating!
Latest version:0.9.0
SHA1 sum:7b0dbcaf176d867d155da8a176a68911affd899c
Author:Peter Van Roy <peter.vanroy@uclouvain.be>
Maintainer:Michael Hendricks <michael@ndrix.org>
Packager:Michael Hendricks <michael@ndrix.org>
Home page:https://github.com/mndrix/edcg
Download URL:https://github.com/mndrix/edcg/archive/v0.9.0.zip


No reviews. Create the first review!.

Details by download location



:- use_module(library(edcg)).

% Declare accumulators
edcg:acc_info(adder, X, In, Out, plus(X,In,Out)).

% Declare predicates using these hidden arguments

increment -->>
    [1]:adder.  % add one to the accumulator

len(Xs,N) :-

len -->>
    [_],  % 'dcg' accumulator has an element
    increment,  % increment the 'adder' accumulator
len -->>


DCG notation gives us a single, hidden accumulator. Extended DCG notation (implemented by this library) lets predicates have arbitrarily many hidden accumulators. As demonstrated by the Synopsis above, those accumulators can be implemented with arbitrary goals (like plus/3).

Benefits of this library:

  • avoid tedium and errors from manually threading accumulators through your predicates
  • add or remove accumulators with a single declaration
  • change accumulator implementation with a single declaration (ex, switching from ordsets to rbtrees)


Extended DCG syntax is very similar to DCG notation. An EDCG is created with clauses whose neck is the -->> operator. The following syntax is supported inside an EDCG clause:

  • {Goal} - don't expand any hidden arguments of Goal
  • Goal - expand all hidden arguments of Goal that are also in the head. Those hidden arguments not in the head are given default values.
  • Goal:L - If Goal has no hidden arguments then force the expansion of all arguments in L in the order given. If Goal has hidden arguments then expand all of them, using the contents of L to override the expansion. L is either a term of the form Acc, `Acc(Left,Right), Pass, Pass(Value)`, or a list of such terms. When present, the arguments Left, Right, and Value override the default values of arguments not in the head.
  • List:Acc - Accumulate a list of terms in the accumulator Acc
  • List - Accumulate a list of terms in the accumulator dcg
  • X/Acc - Unify X with the left term for the accumulator Acc
  • Acc/X - Unify X with the right term for the accumulator Acc
  • X/Acc/Y - Unify X with the left and Y with the right term for the accumulator Acc
  • insert(X,Y):Acc - Insert the arguments X and Y into the chain implementing the accumulator Acc. This is useful when the value of the accumulator changes radically because X and Y may be the arguments of an arbitrary relation
  • insert(X,Y):Acc - Insert the arguments X and Y into the chain implementing the accumulator dcg. This inserts the difference list X-Y into the accumulated list


Declaration of Predicates

Predicates are declared with facts of the following form:

pred_info(Name, Arity, List)

The predicate Name/Arity has the hidden parameters given in List. The parameters are added in the order given by List and their names must be atoms.

Declaration of Accumulators

Accumulators are declared with facts in one of two forms. The short form is:

acc_info(Acc, Term, Left, Right, Joiner)

The long form is:

acc_info(Acc, Term, Left, Right, Joiner, LStart, RStart)

In most cases the short form gives sufficient information. It declares the accumulator Acc, which must be an atom, along with the accumulating function, Joiner, and its arguments Term, the term to be accumulated, and Left & Right, the variables used in chaining.

The long form of acc_info is useful in more complex programs. It contains two additional arguments, LStart and RStart, that are used to give default starting values for an accumulator occurring in a body goal that does not occur in the head. The starting values are given to the unused accumulator to ensure that it will execute correctly even though its value is not used. Care is needed to give correct values for LStart and RStart. For DCG-like list accumulation both may remain unbound.

Two conventions are used for the two variables used in chaining depending on which direction the accumulation is done. For forward accumulation, Left is the input and Right is the output. For reverse accumulation, Right is the input and Left is the output.

Declaration of Passed Arguments

Passed arguments are conceptually the same as accumulators with `=/2` as the joiner function. Passed arguments are declared as facts in one of two forms. The short form is:


The long form is:

pass_info(Pass, PStart)

In most cases the short form is sufficient. It declares a passed argument Pass, that must be an atom. The long form also contains the starting value PStart that is used to give a default value for a passed argument in a body goal that does not occur in the head. Most of the time this situation does not occur.


Using SWI-Prolog 7.1 or later:

?- pack_install(edcg).

This module uses semantic versioning.

Source code available and pull requests accepted at http://github.com/mndrix/edcg

- mit

Contents of pack "edcg"

Pack contains 13 files holding a total of 20.9K bytes.