Next: , Previous: DCG-rules, Up: Syntax   [Contents]


2.14 DCG-goals

A DCG-goal is a term of one of the following forms:

some Vars DCG-goal

A DCG existential quantification. Vars must be a list of variables. DCG-goal must be a valid DCG-goal.

Semantics:

transform(V_in, V_out, some Vars DCG_goal) = 
some Vars transform(V_in, V_out, DCG_goal)
all Vars DCG-goal

A DCG universal quantification. Vars must be a list of variables. DCG-goal must be a valid DCG-goal.

Semantics:

transform(V_in, V_out, all Vars DCG_goal) = 
all Vars transform(V_in, V_out, DCG_goal)
DCG-goal1, DCG-goal2

A DCG sequence. Intuitively, this means “parse DCG-goal1 and then parse DCG-goal2” or “do DCG-goal1 and then do DCG-goal2”. (Note that the only way this construct actually forces the desired sequencing is by the modes of the implicit DCG arguments.) DCG-goal1 and DCG-goal2 must be valid DCG-goals.

Semantics:

transform(V_in, V_out, (DCG-goal1, DCG-goal2)) =
(transform(V_in, V_new, DCG_goal1),
 transform(V_new, V_out, DCG_goal2))

where V_new is a fresh variable.

DCG-goal1 ; DCG-goal2

A disjunction. DCG-goal1 and DCG-goal2 must be valid goals. DCG-goal1 must not be of the form ‘DCG-goal1a -> DCG-goal1b’. (If it is, then the goal is an if-then-else, not a disjunction.)

Semantics:

transform(V_in, V_out, (DCG_goal1 ; DCG_goal2)) =
( transform(V_in, V_out, DCG_goal1)
; transform(V_in, V_out, DCG_goal2) )
{ Goal }

A brace-enclosed ordinary goal. Goal must be a valid goal.

Semantics:

transform(V_in, V_out, { Goal }) = (Goal, V_out = V_in)
[Term, …]

A DCG input match. Unifies the implicit DCG input variable V_in, which must have type ‘list(_)’, with a list whose initial elements are the terms specified and whose tail is the implicit DCG output variable V_out. The terms must be valid data-terms.

Semantics:

transform(V_in, V_out, [Term1, …]) = (V_in = [Term, … | V_Out])
[]

The null DCG goal (an empty DCG input match). Equivalent to ‘{ true }’.

Semantics:

transform(V_in, V_out, []) = (V_out = V_in)
not DCG-goal
\+ DCG-goal

A DCG negation. The two different syntaxes have identical semantics. Goal must be a valid goal.

Semantics:

transform(V_in, V_out, not DCG_goal) =
(not transform(V_in, V_new, DCG_goal), V_out = V_in)

where V_new is a fresh variable.

if CondGoal then ThenGoal else ElseGoal
CondGoal -> ThenGoal ; ElseGoal

A DCG if-then-else. The two different syntaxes have identical semantics. CondGoal, ThenGoal, and ElseGoal must be valid DCG-goals.

Semantics:

transform(V_in, V_out, if CondGoal then ThenGoal else ElseGoal) =
if transform(V_in, V_cond, CondGoal) then
        transform(V_cond, V_out, ThenGoal)
else
        transform(V_in, V_out, ElseGoal)
=(Term)

A DCG unification. Unifies Term with the implicit DCG argument. Term must be a valid data-term.

Semantics:

transform(V_in, V_out, =(Term)) = (Term = V_in, V_out = V_in)
:=(Term)

A DCG output unification. Unifies Term with the implicit DCG output argument, ignoring the input DCG argument. Term must be a valid data-term.

Semantics:

transform(V_in, V_out, :=(Term)) = (V_out = Term)
Term =^ field_list

A DCG field selection. Unifies Term with the result of applying the field selection field_list to the implicit DCG argument. Term must be a valid data-term. field_list must be a valid field list. See Record syntax.

Semantics:

transform(V_in, V_out, Term =^ field_list) =
        (Term = V_in ^ field_list, V_out = V_in)
^ field_list := Term

A DCG field update. Replaces a field in the implicit DCG argument. Term must be a valid data-term. field_list must be a valid field list. See Record syntax.

Semantics:

transform(V_in, V_out, ^ field_list := Term) =
        (V_out = V_in ^ field_list := Term)
DCG-call

Any term which does not match any of the above forms must be a DCG predicate call. If the term is a variable Var, it is treated as if it were ‘call(Var)’. Then, the two implicit DCG arguments are appended to the specified arguments.

Semantics:

transform(V_in, V_out, p(A1, …, AN)) =
p(A1, …, AN, V_in, V_out)

Next: , Previous: DCG-rules, Up: Syntax   [Contents]