如何根据逻辑 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)
感谢。
答案 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)