从咖喱教程的 3.13.3节:
剩余的操作称为刚性操作,而缩小的操作称为灵活操作.所有已定义的操作都是灵活的,而大多数基本操作(如算术运算)都是严格的,因为猜测对它们来说不是一个合理的选择.例如,prelude定义了一个列表连接操作,如下所示:
infixr 5 ++
...
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : xs ++ ys
Run Code Online (Sandbox Code Playgroud)
由于操作"++"是灵活的,我们可以使用它来搜索满足特定属性的列表:
Prelude> x ++ [3,4] =:= [1,2,3,4] where x free
Free variables in goal: x
Result: success
Bindings:
x=[1,2] ?
Run Code Online (Sandbox Code Playgroud)
另一方面,诸如加"+"之类的预定义算术运算是刚性的.因此,使用逻辑变量作为参数的"+"调用flounders:
Prelude> x + 2 =:= 4 where x free
Free variables in goal: x
*** Goal suspended!
Run Code Online (Sandbox Code Playgroud)
库里似乎没有防止写入将被暂停的目标.什么类型的系统可以提前检测到目标是否会被暂停?
当条件类型类实例运行得很深时,可能很难弄清楚为什么ghc抱怨缺少类型类实例.例如:
class MyClass1 c
class MyClass2 c
class MyClass3 c
data MyType1 a
data MyType2 a
instance MyClass1 a => MyClass2 (MyType1 a)
instance MyClass2 a => MyClass3 (MyType2 a)
foo :: (MyClass3 c) => c
foo = undefined
bar :: MyType2 (MyType1 Int)
bar = foo
Run Code Online (Sandbox Code Playgroud)
GHC给出以下错误:
Example.hs:149:7-9: error:
• No instance for (MyClass1 Int) arising from a use of ‘foo’
• In the expression: foo
In an equation for ‘bar’: bar = foo
|
149 | bar = …
Run Code Online (Sandbox Code Playgroud) 将findbugs插件添加到maven 很容易,这样就可以运行了
mvn site
Run Code Online (Sandbox Code Playgroud)
但是,我希望它能随时运行
mvn install
Run Code Online (Sandbox Code Playgroud)
就像单元测试一样.也就是说,如果findbugs发现任何错误,我不希望安装成功.我有办法做到这一点吗?
在多维空间中,我有一组矩形,所有矩形都与网格对齐。(我宽松地使用“矩形”这个词 - 在三维空间中,它们将是矩形棱柱。)
我想查询此集合中与输入矩形重叠的所有矩形。
保存矩形集合的最佳数据结构是什么?我会不时地向集合中添加矩形或从集合中删除矩形,但这些操作并不频繁。我想要快速的操作是查询。
一种解决方案是将矩形的角保留在列表中,并对列表进行线性扫描,查找哪些矩形与查询矩形重叠,并跳过不重叠的矩形。
但是,我希望查询操作比线性更快。
我研究过R 树数据结构,但它保存的是点的集合,而不是矩形的集合,而且我没有看到任何明显的方法来概括它。
我的矩形的坐标是离散的,以防您发现有帮助。
我对通用解决方案感兴趣,但我也会告诉您我的具体问题的属性:我的问题空间具有三个维度,并且它们的多重性变化很大。第一个维度有两个可能的值,第二个维度有 87 个值,第三个维度有 180 万个值。
SAT是NP完全的证明是一个建设性的证明,因此应该可以将它作为一个程序来实现.有没有人这样做过?
我正在寻找一个程序(编译器),它将一个程序(返回true或false)作为输入,并输出一个SAT公式.
因此,例如,编译器可以采用以下程序(以pythonic语法显示,但任何语言都适合我)作为输入,并输出SAT公式.将SAT公式提供给SAT求解器将给出参数"证书"的解决方案.在这种情况下,解决方案将是[False,True,True,True,False],表明{-3,-2,5}是一个解决方案.
def verify(certificate):
problem = [-7, -3, -2, 5, 8]
sum = 0
for (x, b) in zip(problem, certificate):
if b:
sum += x
return sum == 0
Run Code Online (Sandbox Code Playgroud)
显然,输出SAT公式将具有其他辅助变量,因此编译器必须指示哪些变量对应于证书.
这样的编译器已经存在吗?他们中的任何一个都是开源的?