关于选项类型,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);
但是,我不确定在解析此约束时我应该期望作为参数s0
和s
的值。
我可以简单地忽略opt
修饰符的存在,并假设约束签名等于下一个吗?
predicate alternative(var int: s0, var int: d0,
array[int] of var int: s,
array[int] of var int: d);
如果没有,我应该如何处理?
答案 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;并且不太可能以这种方式调用。)