sml 中的逻辑简化
我正在 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);
I'm creating logic simplification program in sml. But I have a problem for this input:
- Or(Or(Var"x", Var"y"), Var"z");
val it = Or (Or (Var #,Var #),Var "z") : formula
- Simplify it;
And it's in an infinite loop.
Here is my code:
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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
有三种情况确实很可疑:
基本上,如果 x 和 y 无法进一步简化,
Simplify x
和Simplify y
将返回x
> 和y
。因此,您将使用与之前相同的输入调用 Simplify(Or(x, y)
、And(x, y)
或Not x
) 。您可以使用一些示例来测试您的函数是否不会终止,例如:And(And(Var "x", Var "y"), Var "z")
和Not(And (Var "x", Var "y")
简化的想法是,您希望在内部子句中传播
True
或False
。请注意,您不会尝试简化 if x 和y 是不可约的。更新:
您的函数可以按如下方式修复:
更新 2:
我认为您尝试使用自上而下的方法,这并不适合我重写。函数使用自下而上的方法使其更短且更具可读性:
There are three cases which are really suspicious:
Basically, if x and y couldn't be simplified further,
Simplify x
andSimplify y
will returnx
andy
. So you will invoke Simplify with the same input as before (Or(x, y)
,And(x, y)
orNot x
). You can test that your function doesn't terminate with some examples such as:And(And(Var "x", Var "y"), Var "z")
andNot(And(Var "x", Var "y")
.The idea of simplification is that you have
True
orFalse
in an inner clause, you want to propagate it to outer levels. Note that you will not try to simplify if x and y are irreducible.UPDATE:
Your function could be fixed as follows:
UPDATE 2:
I think you tried to use top-down approach which is not really appropriate. I rewrite the function using bottom-up approach to make it shorter and more readable: