我在sml中创建逻辑简化程序。但是这个输入有问题:
- Or(Or(Var"x", Var"y"), Var"z");
val it = Or (Or (Var #,Var #),Var "z") : formula
- Simplify it;
它处于无限循环中。
这是我的代码:
fun Simplify (Or(True, _)) = True
| Simplify (Or(_, True)) = True
| Simplify (Or(False, False)) = False
| Simplify (Or(x, False)) = (Simplify x)
| Simplify (Or(False, x)) = (Simplify x)
| Simplify (Or (Var (x), Var (y))) = Or (Var (x), Var (y))
| Simplify (Or (x, y)) = (Simplify (Or (Simplify x, Simplify y)))
| Simplify (And(_, False)) = False
| Simplify (And(False, _)) = False
| Simplify (And(True, True)) = True
| Simplify (And(True, x)) = (Simplify x)
| Simplify (And(x, True)) = (Simplify x)
| Simplify (And(Var (x), Var(y))) = And (Var (x), Var (y))
| Simplify (And (x, y)) = (Simplify (And (Simplify x, Simplify y)))
| Simplify (Not(Not(x))) = (Simplify x)
| Simplify (Not(True)) = False
| Simplify (Not(False)) = True
| Simplify (Not(Var (x))) = (Not (Var x))
| Simplify (Not(x)) = (Simplify (Not (Simplify x)))
| Simplify True = True
| Simplify False = False
| Simplify (Var(x)) = Var(x);
答案 0 :(得分:3)
有三个案例真的很可疑:
| Simplify (Or (x, y)) = (Simplify (Or (Simplify x, Simplify y)))
| Simplify (And (x, y)) = (Simplify (And (Simplify x, Simplify y)))
| Simplify (Not(x)) = (Simplify (Not (Simplify x)))
基本上,如果无法进一步简化x和y,Simplify x
和Simplify y
将返回x
和y
。因此,您将使用与之前相同的输入(Or(x, y)
,And(x, y)
或Not x
)调用Simplify。您可以测试您的函数不会以某些示例结束,例如:And(And(Var "x", Var "y"), Var "z")
和Not(And(Var "x", Var "y")
。
简化的想法是你在内部子句中有True
或False
,你想将它传播到外层。请注意,如果x和y不可约,则不会尝试简化。
<强>更新强>
您的功能可以修复如下:
fun Simplify (Or(True, _)) = True
| ... (* Keep other cases as before *)
| Simplify (Or (x, y)) = (case Simplify x of
True => True
| False => Simplify y
| x' => (case Simplify y of
True => True
| False => x'
| y' => Or(x', y')))
| Simplify (And (x, y)) = (case Simplify x of
False => False
| True => Simplify y
| x' => (case Simplify y of
False => False
| True => x'
| y' => And(x', y')))
| Simplify (Not x) = case Simplify x of
True => False
| False => True
| x' => Not x'
更新2:
我认为您尝试使用自上而下的方法,这种做法并不合适。我使用自下而上的方法重写函数,使其更短,更易读:
fun Simplify True = True
| Simplify False = False
| Simplify (Var x) = Var x
| Simplify (Not x) = (case Simplify x of
True => False
| False => True
| x' => Not x')
| Simplify (And(x, y)) = (case Simplify x of
False => False
| True => Simplify y
| x' => (case Simplify y of
False => False
| True => x'
| y' => And(x', y')))
| Simplify (Or(x, y)) = (case Simplify x of
True => True
| False => Simplify y
| x' => (case Simplify y of
True => True
| False => x'
| y' => Or(x', y')))