pattern-matching - sml 中的逻辑简化

标签 pattern-matching expression sml first-order-logic

我正在 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);

最佳答案

有三起案件确实可疑:

| 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 xSimplify y 将返回 xy 。因此,您将使用与之前相同的输入调用 Simplify(Or(x, y)And(x, y)Not x) 。您可以使用一些示例来测试您的函数是否不会终止,例如: And(And(Var "x", Var "y"), Var "z")Not(And (变量“x”,变量“y”)

简化的想法是,您在内部子句中有 TrueFalse,您希望将其传播到外部级别。请注意,如果 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')))

关于pattern-matching - sml 中的逻辑简化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8361878/

相关文章:

c# - 使用模式匹配,我如何从 T 库调用方法

java - 如何使用模式类(正则表达式)计算 java 字符串中每个字符的出现次数

python - 如何在python中仅替换正则表达式中的第一个单词

data-structures - 权重偏左的堆 : advantages of top-down version of merge?

lisp - Common Lisp 中的相互递归

xpath - 使用包含和通配符

ldap - rabbitmq ldap对用户DN不一致的组进行授权

c# - DataTable 表达式无法解释标记 '!'

c# - 是否立即调用 "=>"表达式?

types - 设计模块时如何决定是在类型级别还是模块级别进行参数化?