通过" OR"对谓词进行分区。 Java中的逻辑

时间:2017-05-16 22:22:23

标签: java algorithm tree logic

如何根据逻辑 OR(||) 将谓词划分为多个谓词?结果谓词的评估与输入谓词相同。结果谓词不得包含逻辑 OR(||) 。 任何想法/算法/ java /伪代码都会有所帮助。

示例输入输出: -

Input:  a>b || p>q
Output: a>b, p>q

Input: (a>b || p>q) && x>y
Output: (a>b && x>y), (p<q && x>y)

Input: (a>b || p>q) && (x>y || r>s)
Output: (a>b && x>y), (a>b && r>s), (p>q && x>y), (p>q && r>s)

Input: (a>b || p>q) && (x>y && r>s)
Output: (a>b && x>y && r>s), (p>q && x>y && r>s)

Input: (a>b || p>q) && (x>y && (r>s || m>n))
Output: (a>b && x>y && r>s),(a>b && x>y && m>n),(p>q && x>y && r>s),(p>q && x>y && m>n)

感谢。

2 个答案:

答案 0 :(得分:1)

您解析输入,例如(a>b || p>q) && (x>y && (r>s || m>n)),放入二进制表达式树。

           &&
    ||              &&
 >      >      >          ||
a b    p q    x y      >      >
                      r s    m n

然后找到||节点并克隆树两次,将||节点替换为节点的每一侧。

       &&                              &&
 >           &&                   >           &&
a b     >          ||            p q     >          ||
       x y      >      >                x y      >      >
               r s    m n                       r s    m n

然后再次执行此操作,直到所有||都被删除。

      &&                      &&                      &&                      &&
 >         &&            >         &&            >         &&            >         &&
a b     >      >        p q     >      >        a b     >      >        p q     >      >
       x y    r s              x y    r s              x y    m n              x y    m n

最后,打印结果。

a>b && (x>y && r>s)
p>q && (x>y && r>s)
a>b && (x>y && m>n)
p>q && (x>y && m>n)

答案 1 :(得分:0)

这是一个javascript函数,递归地解析输入然后乘以术语:

function parsePredicateIntoBinaryTree(predicate) {
    function trimParen(a) {
        return a.trim().replace(/^\(*/, '').replace(/\)*$/, '').trim();
    }
    function multiplyTerms(s, t) {
        return s.reduce(function (c, a) {
            t.forEach(function (b) {
                c.push(a.trim() + ' && ' + b.trim())
            });
            return c;
        }, []);
    }
    predicate = trimParen(predicate);
    var firstAmp = predicate.indexOf('&&')
    var leftTerm = predicate.substring(0, firstAmp);
    var rightTerm = predicate.substring(firstAmp + 2);
    var leftLeaf = leftTerm.indexOf('&&') < 0;
    var rightLeaf = rightTerm.indexOf('&&') < 0;
    if(leftLeaf && rightLeaf)
    {
        var a = trimParen(leftTerm).split('||');
        var b = trimParen(rightTerm).split('||');
        return multiplyTerms(a, b);
    }
    else if(leftLeaf && !rightLeaf)
    {
        var a = trimParen(leftTerm).split('||');
        var b = parsePredicateIntoBinaryTree(rightTerm);
        return multiplyTerms(a, b);
    }
    else if(!leftLeaf && rightLeaf)
    {
        var a = parsePredicateIntoBinaryTree(leftTerm);
        var b = trimParen(rightTerm).split('||');
        return multiplyTerms(a, b);
    }
    else if(!leftLeaf && !rightLeaf)
    {
        var a = parsePredicateIntoBinaryTree(leftTerm);
        var b = parsePredicateIntoBinaryTree(rightTerm);
        return multiplyTerms(a, b);
    }
}
function parsePredicate(predicate){
    console.log('Input:  ' + predicate);
    console.log('Output:  (' + parsePredicateIntoBinaryTree(predicate).join('),(') + ')');
}

parsePredicate('(a>b || p>q && (z<h || y>=e)) && (x>y && (r>s || m>n))');

Input:  (a>b || p>q && (z<h || y>=e)) && (x>y && (r>s || m>n))
Output:  (a>b && z<h && x>y && r>s),(a>b && z<h && x>y && m>n),(a>b && y>=e && x>y && r>s),(a>b && y>=e && x>y && m>n),(p>q && z<h && x>y && r>s),(p>q && z<h && x>y && m>n),(p>q && y>=e && x>y && r>s),(p>q && y>=e && x>y && m>n)