```    1:- module(
2  default,
3  [
4    call_default_value/2,  % ?Value, :Goal_1
5    call_default_value/3,  % ?Value, :Goal_1, +DefaultValue
6    default_value/2,       % ?Value, +DefaultValue
7    default_value/3        % ?FromValue, -ToValue, +DefaultValue
8  ]
9).```

# Support for default values

*/

```   15:- meta_predicate
16    call_default_value(?, 1),
17    call_default_value(?, 1, +).```
call_default_value(?Value, :Goal_1) is det
If `Value' is not bound, call `Goal_1' to determine its default value.
```   28call_default_value(Value, _) :-
29  nonvar(Value), !.
30call_default_value(Value, Goal_1) :-
31  call(Goal_1, Value).```
call_default_value(?Value, :Goal_1, +DefaultValue) is det
If `Value' cannot be determined by calling `Goal_1', the `DefaultValue' is used instead.
```   39call_default_value(Value, Goal_1, _) :-
40  call(Goal_1, Value), !.
41call_default_value(DefaultValue, _, DefaultValue).```
default_value(?Value, +DefaultValue) is det
Returns either the given value or the default value, in case there is no value given.

# Example

Ordering is a meta-argument that allows a list of elements to be arbitrarily ordered. The use of default_value/2 here allows the original ordering of elements to be retained in case the Ordering argument is not instantiated.

```default_value(=, Ordering),
once(call(Ordering, L1, L2))```
```   62default_value(Value, _):-
63  nonvar(Value), !.
64default_value(DefaultValue, DefaultValue).```
default_value(?FromValue, -ToValue, +DefaultValue) is det
Returns the given value, unless the given value is a variable. In the latter case, the default value is returned instead.

@note We are sometimes using this predicate instead of default_value/2 from ``library(default)`' because we do not want variable occurrences of `FromValue' to get instantiated.

```   77default_value(X, Y, Y):-
78  var(X), !.
79default_value(X, X, _)```