簡體   English   中英

將 Or(And) 邏輯語句轉換為 And(Or) 語句

[英]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

但請記住,我們不是在進行加法和乘法運算,而是在進行邏輯ANDOR運算。 這意味着也許不僅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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM