解析时的Option Type实例是什么?

时间:2017-11-02 14:19:02

标签: constraint-programming minizinc flatzinc

关于选项类型,Minizinc的specification(第6.6.3节)说:

  

概述。使用opt类型构造函数定义的选项类型,定义可能存在或不存在的类型。它们类似于可能类型的Haskell隐含性为类型添加新值<>

     

[...]

     

初始化。 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);

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

1 个答案:

答案 0 :(得分:1)

在MiniZinc中,变量选项类型作为可能不存在的变量处理。在编译器中,这些变量被转换,这些变量被解释和重写,使得FlatZinc输出仅包含实际变量。通常这意味着如果变量&#34;存在&#34;则为每个变量添加一个布尔变量,该变量为真。

对于库编写者,可以选择以您的求解器能够处理得最好的方式重写它。在标准库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

请注意,alternative内在函数用于测试变量是否存在。可以在MiniZinc库中找到更多可变类型的内在函数:http://www.minizinc.org/doc-lib/doc-optiontypes.html。如有必要,您还可以使用let-expression创建额外变量,然后将谓词映射到求解器内在谓词。

即使解算器没有更好的可选类型谓词分解,在没有选项类型的情况下实现谓词仍然是值得的。由于MiniZinc的重载,只要使用非选项变量类型的数组调用谓词,就会使用该实现。 (请注意,import React from "react"; import {Header} from './Header'; export class Login extends React.Component{ constructor() { super(); this.state = { user: {} }; this.onSubmit = this.handleSubmit.bind(this); } handleSubmit(e) { e.preventDefault(); //const proxyurl = "https://cors-anywhere.herokuapp.com/"; var self = this; // On submit of the form, send a POST request with the data to the server. fetch('http://localhost:3000/login', { method: 'POST', body: { name: self.refs.name, job: self.refs.job } }) .then(function(response) { return response.json() }).then(function(body) { console.log(body); }); } render(){ return( <div> <div id="fm"> <form onSubmit={this.onSubmit} > <div > <label> Username: <input id="uname" type="text" placeholder="Name" ref="name"/> </label> </div> <div > <label> Password: <input id="upass" type="password" placeholder="Jo b" ref="job"/> </label> </div> <input id="sub" type="submit" value="Submit" /> </form> </div> </div> ); } } 谓词专门用于&#34;可选任务&#34;并且不太可能以这种方式调用。)