module 'data.array.non_backtrackable' [Impl] { new(Sizes, InitialValue, Array) :- length(Sizes, Dim), 'kernel':array_non_backtrackable_new(Sizes, InitialValue, X), Impl:array(Dim, Sizes, X, Array). }, module Impl { array(Dim, Sizes, X, Array) :- module Array [Dim, Sizes, Array, X] { [Index | Tail] = Value :- Array:get([Index | Tail], Value). get(Indexes, Value) :- 'data.list':length(Indexes, Len), ( Len = Dim -> 'kernel':array_non_backtrackable_get(X, Indexes, Value) ; throw(error(dimension_mismatch, array)) ). set(Indexes, Value) :- 'data.list':length(Indexes, Len), ( Len = Dim -> 'kernel':array_non_backtrackable_set(X, Indexes, Value) ; throw(error(dimension_mismatch, array)) ). sizes(Sizes). deep_list = Iter:iter(Sizes, []) :- module Iter [X, Iter] { iter([], Indexes) = 'kernel':array_backtrackable_get(X, Indexes). iter([Size | Tail], Indexes, List) :- module Init [Iter, Indexes, Tail] { get(Index) = Iter:iter(Tail, 'data.list':append(Indexes, [Index])). }, 'data.list':init(0, 'data.number':pred(Size), Init, List). }. pretty = 'data.array.non_backtrackable:'(Array:deep_list) }. }