Next: , Previous: DCG-rules, Up: Syntax


2.12 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)