繁体   English   中英

解析时选项类型的实例是什么?

[英]What is an instance of Option Type at parsing time?

关于选项类型 ,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);

但是,我不确定解析此约束时作为参数s0s值应该期望什么。

我可以简单地忽略opt修饰符的存在,并假设约束签名等于下一个吗?

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

如果没有,我应该如何处理?

在MiniZinc中,变量选项类型被视为可能不存在的变量。 在编译器中,将对这些变量进行转换,并以FlatZinc输出仅包含实际变量的方式来解释和重写这些变量。 通常,这意味着为每个变量添加一个布尔变量,如果且仅当变量“存在”时才为true。

对于库编写者,可以选择用一种方式重写它,以使您的求解程序能够最好地处理。 在标准库中, 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谓词专门用于“可选任务”,不太可能那样称呼)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM