Что представляет собой экземпляр Option Type во время синтаксического анализа?

Что касается типов параметров, спецификация для Minizinc (раздел 6.6.3) говорит:

Обзор. Типы параметров, определенные с помощью конструктора типов opt, определяют типы, которые могут быть или не быть. Они похожи на типы неявности Haskell в Maybe, добавляющие к типу новое значение <>.

[...]

Инициализация. Переменную типа opt не нужно инициализировать во время экземпляра. Неинициализированная переменная типа opt автоматически инициализируется значением <>.

Я хотел бы проанализировать и обработать следующее ограничение с двумя opt типами:

predicate alternative(var opt int: s0, var int: d0,
                      array[int] of var opt int: s,
                      array[int] of var int: d);

Однако я не уверен, что мне следует ожидать в качестве значений аргументов s0 и s при синтаксическом анализе этого ограничения.

Могу ли я просто проигнорировать присутствие модификатора opt и предположить, что подпись ограничения равна следующей?

predicate alternative(var int: s0, var int: d0,
                      array[int] of var int: s,
                      array[int] of var int: d);

Если нет, как мне с этим справиться?


person Patrick Trentin    schedule 02.11.2017    source источник
comment
var opt может быть довольно сложно просто использовать, и я считаю, что еще хуже разбирать и обрабатывать дальше. Возможно, вам следует задать этот вопрос на странице minizinc.org/forum.html. Это немного ближе к разработчикам MiniZinc. (Вы реализуете решатель FlatZinc для OptiMatSAT? Надеюсь, вы сделаете его общедоступным.)   -  person hakank    schedule 03.11.2017
comment
@hakank Я попробую на этой доске, спасибо. OptiMathSAT уже имеет интерфейс для подмножества языка FlatZinc, начиная с версии 1.4. В настоящее время мы расширяем этот интерфейс, чтобы охватить еще несколько глобальных ограничений, по соображениям производительности, и тестируем различные кодировки.   -  person Patrick Trentin    schedule 04.11.2017
comment
Ах, я это пропустил. Проверим как можно скорее. :-)   -  person hakank    schedule 04.11.2017
comment
@hakank Я бы не сказал, что на данном этапе это то, чем можно ужасно волноваться, но я благодарю вас за ваш интерес. Если вы обнаружите какие-либо ошибки, на нашем веб-сайте вы можете найти контактный адрес электронной почты для отчетов. (:   -  person Patrick Trentin    schedule 04.11.2017
comment
Сделаю. Сейчас тестирую. :-)   -  person hakank    schedule 04.11.2017


Ответы (1)


В MiniZinc типы параметров переменных обрабатываются как переменные, которые могут не существовать. В компиляторе эти переменные преобразуются, эти переменные интерпретируются и переписываются таким образом, что вывод FlatZinc содержит только фактические переменные. Обычно это означает, что логическая переменная добавляется к каждой переменной, которая истинна, если и только если переменная «существует».

Для разработчиков библиотеки есть возможность переписать ее таким образом, чтобы ваш решатель мог справиться лучше всего. В стандартной библиотеке alternative определяется как:

predicate alternative(var opt int: s0, var int: d0,
                  array[int] of var opt int: s,
                  array[int] of var int: d) =
          assert(index_set(s) = index_set(d),
                 "alternative: index sets of third and fourth argument must be identical",
          sum(i in index_set(s))(bool2int(occurs(s[i]))) <= 1 /\
          span(s0,d0,s,d)
      );

Обратите внимание, что встроенная функция occurs используется для проверки существования переменной. Дополнительные встроенные функции для типов переменных можно найти в библиотеке MiniZinc: http://www.minizinc.org/doc-lib/doc-optiontypes.html. При необходимости вы также можете использовать let-выражение для создания дополнительной переменной, а затем сопоставить предикат с внутренним предикатом решателя.

Даже если нет лучшей декомпозиции предиката необязательного типа для вашего решателя, все же может быть целесообразно реализовать предикат без типов опций. Из-за перегрузки MiniZinc эта реализация будет использоваться всякий раз, когда предикат вызывается с массивами типов переменных, не являющихся опциями. (Обратите внимание, что предикат alternative специально предназначен для «необязательных задач» и вряд ли будет называться таким образом).

person Dekker1    schedule 06.11.2017
comment
Итак, часть optional - это не type, а сама variable: эквивалентна ли она концепции необязательных аргументов в programming language of your choice? Когда я вижу что-то вроде этого: array[int] of var opt int: s, гарантировано ли мне, что либо массив s вообще отсутствует, либо все ячейки памяти s[i] существуют? Другими словами, допускает ли язык массив s со смешанными существующими / несуществующими ячейками памяти? - person Patrick Trentin; 07.11.2017
comment
@PatrickTrentin Вы могли неправильно понять, что я имел в виду. MiniZinc допускает смешанные существующие / несуществующие переменные в массивах. Скажем, например, что массив состоит из времени начала ряда задач, тогда этот массив будет array[N] of int. Однако, если я не знаю, сколько там задач, мне придется заняться чем-то другим. В MiniZinc вы должны использовать тип array[N] of opt int, где N - максимальное количество задач. Если никакие уловки использовать нельзя, мы создаем переменные int и bool для всех N чисел, но часто эти логические значения можно объединить. - person Dekker1; 08.11.2017
comment
@PatrickTrentin Обратите внимание, что MiniZinc и FlatZinc не влияют на адреса памяти, а на переменные. Реализация этих переменных зависит от решающей программы. Также может быть полезно знать, что необязательные переменные обычно являются результатом понимания массива с переменными в предложении where. - person Dekker1; 08.11.2017
comment
Я провел несколько тестов и действительно понял, как это работает сейчас, спасибо за вашу помощь. - person Patrick Trentin; 08.11.2017