我用Python实现了一个解决游戏"扫雷"的算法.该计划的工作原理如下:
假设求解器单击名为"a"的正方形.为了举例,让这样揭示的数字等于2.尚未被点击的正方形的邻居(再次作为示例)被命名为"b"和"c".程序然后将正方形与表达式[2,{'b','c'}]相关联,并从所有其他表达式中删除'a'.在两种情况下,通过成对简化这些表达式来推断哪些正方形是地雷并且不进行收益.
如果一个表达式中的正方形是另一个表达式的正方形的子集:
[2, {'a', 'b', 'c'}], [1, {'a', 'b'}] -> [1, {'c'}], [1, {'a', 'b'}]
Run Code Online (Sandbox Code Playgroud)如果一个表达式中的所有正方形都被确定为地雷:
[2, {'a', 'b'}], [1, {'b', 'c'}] -> [2, {'a', 'b'}], [0, {'c'}]
Run Code Online (Sandbox Code Playgroud)然后,对于某些表达式X,如果X[0] == 0,我们可以自由地点击命名的所有正方形X[1],如果X[0] == len(X[1]),那么我们可以标记它们.
但是,我正在努力确定哪些表达式试图简化.我目前的做法是保持一堆正方形; 无论何时单击一个正方形,或者已成功简化其表达式,都会将其添加到堆栈中(如果它尚未存在).当方从堆栈中弹出,简化尝试其表达(之间X),以及任何其他表达式Y,使得X[1] & Y[1] != set().当堆栈耗尽时,算法终止.然而,目前虽然这很有效,但它无法正确解决所有明确的配置,如果我用队列替换堆栈,或者使用某种算法确定要弹出哪个方块,它在给定板上的执行情况会有显着变化!
对于我的方法的先例或潜在探索的途径,我将非常感激.
我正在阅读Terry Tao的真实分析教科书,它从自然数字中建立起基础数学.通过尽可能多地形式化证明,我希望能够熟悉Idris和依赖类型.
我已经定义了以下数据类型:
data GE: Nat -> Nat -> Type where
Ge : (n: Nat) -> (m: Nat) -> GE n (n + m)
Run Code Online (Sandbox Code Playgroud)
表示一个自然数大于或等于另一个自然数的命题.
我目前正在努力证明这种关系的反身性,即用签名来构建证明
geRefl : GE n n
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试就是尝试geRefl {n} = Ge n Z,但这种类型Ge n (add n Z).为了使这与所需的签名统一起来,我们显然必须进行某种重写,可能涉及引理
plusZeroRightNeutral : (left : Nat) -> left + fromInteger 0 = left
Run Code Online (Sandbox Code Playgroud)
我最好的尝试如下:
geRefl : GE n n
geRefl {n} = x
where x : GE n (n + Z)
x = rewrite plusZeroRightNeutral n …Run Code Online (Sandbox Code Playgroud) 在我的代码中,我有一个相互递归的树结构,如下所示:
enum Child<'r> {
A(&'r Node<'r>),
B,
C
}
struct Node<'r> {
children : [&'r Child<'r>,..25]
}
impl <'r>Node<'r> {
fn new() -> Node {
Node {
children : [&B,..25]
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它不按原样编译.修改它的最佳方法是什么?
我有一组变量S,并在S上定义了一个布尔函数f,如下所示:
˚F(X 1,X 2,... X Ñ)= TRUE当且仅当˚F(X 我,X Ĵ)= TRUE∀1≤I≤ Ñ ∀1≤Ĵ≤ Ñ,Ñ > 1,否则为False.
f(a,b)是已知的,f(a,a)是S中的真∀a,b .
我很感激在设计快速算法方面提供了一些帮助,该算法可以返回S的所有子集,其中f返回True.
例如,令S = [a,b,c]和f(a,b)= f(b,c)= f(a,c)= True.然后该算法应返回[[a,b],[a,c],[b,c],[a,b,c]].
我想到了四种改进强力搜索的策略:
1)f的参数顺序无关紧要.
2)使用f(a,a)为真且f(x i,x j)= f(x j,x i)的事实,因此只有i <j需要检查.
2)使用f(x 1,x 2 …