[英]Convert Or(And) logical statements to And(Or) statements
假設我們有這些比較運算符:
export enum ComparisonOperators {
MATCH_CONTAINS = 'contains',
MATCH_DOES_NOT_CONTAIN = 'not_contains',
MATCH_EQUALS = 'equals',
MATCH_NOT_EQUALS = 'not_equals',
MATCH_STARTS_WITH = 'starts_with',
MATCH_DOES_NOT_START_WITH = 'not_starts_with',
MATCH_ENDS_WITH = 'ends_with',
MATCH_DOES_NOT_END_WITH = 'not_ends_with',
MATCH_REGEX = 'matches_regex',
DOES_NOT_MATCH_REGEX = 'not_matches_regex',
}
假設我們有 Json 格式的 Or(And) 邏輯語句:
{
nodeType: 'OR',
children: [
{
nodeType: 'AND',
children: [
{
operator: ComparisonOperators.MATCH_EQUALS,
field: 'A',
nodeType: 'LEAF',
value: 'abc',
},
{
operator: ComparisonOperators.MATCH_STARTS_WITH,
field: 'B',
nodeType: 'LEAF',
value: 'rfg',
},
],
},
{
nodeType: 'AND',
children: [
{
operator: ComparisonOperators.MATCH_DOES_NOT_END_WITH,
field: 'C',
nodeType: 'LEAF',
value: 'esa',
},
{
operator: ComparisonOperators.MATCH_REGEX,
field: 'D',
nodeType: 'LEAF',
value: '/[0-9]{4}/.source',
},
],
},
],
}
含義(用簡單的語言):
('A' equals 'abc' AND 'B' startsWith 'rfg') OR ('C' doesNotEndWith 'esa' AND 'D' matchRegex '/[0-9]{4}/.source')
我需要創建一個算法來轉換
OR(AND) = (-- AND -- AND ...) OR (-- AND -- AND ...) OR ...
到
AND(OR) = (-- OR -- OR ...) AND (-- OR -- OR ...) AND ...
反之亦然
將AND(OR)
轉換為OR(AND)
很容易 => (a+b) * (c+d) = a*c + a*d + b*c + b*d
但是我找不到相反的方法?
正如您所指出的, (a+b) * (c+d) = a*c + a*d + b*c + b*d
。
你說你找不到如何做相反的事情。 那么讓我們思考一下為什么上面的說法是正確的。
這是因為以下內容成立:
(a+b) * c = a*c + b*c
。 因此, (a+b) * (c+d) = a*(c+d) + b*(c+d) = a*c + a*d + b*c + b*d
。
但請記住,我們不是在進行加法和乘法運算,而是在進行邏輯AND
和OR
運算。 這意味着也許不僅AND
分布在OR
上,而且OR
可能分布在AND
上。
(a*b) + c = a+c * b+c
確實如此。 (你能看出為什么嗎?如果沒有,只需考慮所有 8 種可能性。
因此, (a*b) + (c*d) = a+c * a+d * b+c * b+d
。 所以事實上,你可以做你已經提到的完全相同的事情,但操作翻轉。 這不是很整潔嗎?
現在這意味着,從AND(OR)
轉換為OR(AND)
然后返回AND(OR)
很可能會導致比原始輸入更長的 output,但是減少這個 output 的長度可能非常困難要通過算法解決的問題,我懷疑您的任務是否需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.