Specificiation
Atoms
There are two types of atoms in the NDL language:
- integers, i.e.
0 - variables with Prolog syntax, i.e.
X,Variable,_OtherVariable - variable indexes, that are terms with arity depending on the variable dimensionality, i.e. for a 2-dimension array of variable named
queen, the variable's index takes formqueen(<integer>, <integer>), i.e.queen(1,1).
Additionaly string constants (lower case, as name) and the integer ranges (written as 0..10) are used as a syntax sugar in model definitions, but aren't used in the NDL query itself.
Types
Every atom has an associated type, storing additional information about the atom:
- in case of the variable, type defines domain of the variable; language doesn't allow to change the variable's type, therefore all arithmetic operations are implemented in a way to satisfy the domain closure
Types are defined in the NDL model as constants and are problem dependent.
Model
NDL model is a typed Prolog program consisting of following predicates:
- Constant related:
-
constant_definition(+Name:string, -Constant:integer)- contains the constant definition. Constant should be understood as a type with only one possible value. The predicate should be used only using the compilation and shouldn't be used in the NDL queries. -
constant_usages(+Name:string, -Context:list)- another compile-only information.Contextcotains information about all possible contexts, where the constant may be used, i.e. it allows to emulate the typed arguments in other predicates. Possible contexts include:- domain of a variable
- indexing of a variable in a specific axis/dimension
- to be part of an arithmetic expression with a variable's value FIXME
- to be part of an arithmetic expression with a variable's index in a specific axis/dimension FIXME
-
constant(+Name:string, -Value:integer)- allows to get constant value by it's name. Used in the NDL query. -
constant_range_definition(+Name:string, -Range:range)- analogically to the integer constant, this defines a type with a range of possible values. - `constant_range_usages(+Name, -Context:list) - again, used to simulate typing in the Prolog program.
-
constant_range(+Name:string, -Value:integer) is nondet- allows to non-deterministically get one of the type inhibitants. Used in the NDL query.
-
- Variable related:
-
fixed(+Name:string)- variables with this name shouldn't be modified by the NDL query. Used only during compilation. -
variable(+Name:string, -Index:variable_index) is nondet- allows to non-deterministically get an index of the variable namedName. Used in the NDL query. -
new_value(+Name:string, -Value:Integer) is nondet- allows to non-deterministically get an possible value for the variable namedName. Used in the NDL query.
-
- Constraint related:
-
constraint(+Name:string, ?Index1:variable_index, ?Index2:variable_index) is nondet- allows to non-deterministically check if two variables indexedIndex1andIndex2are constrained with a constraint namedName. Also allows to find indexes satisfying those requirements. Used in the NDL query. -
is_satisfied(+Name:String, +Index1:variable_index, +Index2:variable_index)- allows to check if the constraint namedNameis satisfied on variables indexedIndex1andIndex2. Used in the NDL query. FIXME dynamic_predicate(constraint/3, public).
-
Query
NDL query is a Prolog like program, containing rules, with bodies consisting of goals from a predefined set of clauses:
- NDL model clauses:
constraint/2,constraint_range/2,variable/2,new_value/2,constraint/3,is_satisfied/3 - binary arithmetic operations: +, -, /, *, div, mod
- binary arithmetic comparisons: =, >=, >, <, <=
- heads of the rules defined in the query itself (allows recursion)
- operation operating on the current solution:
-
get_value(+Index:variable_index, -Value:integer)- gets the variable's current value -
set_value(+Index:variable_index, +Value:integer)- set the variable's value toValue -
swap_values(+Index1:variable_index, +Index2:variable_index)- swap values of two variables
-