LINUX.ORG.RU

История изменений

Исправление gloomdemon, (текущая версия) :

Говоря «не по порядку» я имел в виду, что никто не гарантирует, что решения будут находиться в каком-то определённом порядке.

Пример?

:- pred get_x(int::out) is multi.

get_x(X) :- X = 2 ; X = 3.

если затем вызывать get_x(X) то в большинстве случаев X вначале будет 2, потом 3, но этого никто не гарантирует, т.к. с логической точки зрения, что X=2;X=3, что X=3;X=2 все одинаково. Тут все зависит от того как скомпилирует это компилятор mercury. У mmc на этот счет есть даже ключики --no-reorder-conj, --no-reorder-disj потому что для оптимизации он может менять порядок выражений.

Если смотреть стандартный модуль solutions то там будет так:

solutions/2 collects all the solutions to a predicate and returns them as a list in sorted order, with duplicates removed.

solutions_set/2 returns them as a set.

unsorted_solutions/2 returns them as an unsorted list with possible duplicates; since there are an infinite number of such lists, this must be called from a context in which only a single solution is required.

Operationally, however, do_while/4 will call the Filter predicate for each solution as it is obtained, rather than first building a list of all the solutions.

Исходная версия gloomdemon, :

Говоря «не по порядку» я имел в виду, что никто не гарантирует, что решения будут находиться в каком-то определённом порядке.

Пример?

:- pred get_x(int::out) is multi.

get_x(X) :- X = 2 ; X = 3.

если затем вызывать get_x(X) то в большинстве случаев X вначале будет 2, потом 3, но этого никто не гарантирует, т.к. с логической точки зрения, что X=2;X=3, что X=3;X=2 все одинаково. Тут все зависит от того как скомпилирует это компилятор mercury. У mmc на этот счет есть даже ключики --no-reorder-conj, --no-reorder-disj потому что для оптимизации он может менять порядок выражений.

Если смотреть стандартный модуль solutions то там будет так:

solutions/2 collects all the solutions to a predicate and returns them as a list in sorted order, with duplicates removed.

solutions_set/2 returns them as a set.

unsorted_solutions/2 returns them as an unsorted list with possible duplicates; since there are an infinite number of such lists, this must be called from a context in which only a single solution is required.