在邏輯學中,析取範式和合取範式分別是命題邏輯中某些命題的標準化形式,它們是由命題變數和邏輯運算符組成的組合式。
一、析取範式
1、什麼是析取範式?
在命題邏輯中,析取範式是由若干個含有變數的析取式進行「與」運算而得到的命題。
2、析取範式的含義
如果一個命題是由多個命題「或」起來的,則我們可以將其表示為一個含有變數的析取式。
例如:
((p1 ∨ p2) ∧ (p1 ∨ ¬p2) ∧ (¬p1 ∨ p2))
這個式子可以表示為:如果 p1 與 p2 中至少有一個成立,那麼命題就成立。
3、如何將一個命題轉化為它的析取範式?
我們可以使用以下步驟將一個命題轉化為它的析取範式:
1、將命題中的「與」運算符轉化為「或」運算符;
2、根據「或」運算符的結合律,將多個變數的「或」運算符進行合併;
3、根據德摩根定律,對含有「非」運算符的變數進行變形,得到不含有「非」運算符的項。
例如,對於命題(p → q) ∧ (¬p ∨ r),我們可以按以下步驟轉化為析取範式:
1、將命題中的「與」運算符轉化為「或」運算符:
(p → q) ∧ (¬p ∨ r) = (¬p ∨ q) ∧ (p ∨ r)
2、根據「或」運算符的結合律,將多個變數的「或」運算符進行合併:
(¬p ∨ q) ∧ (p ∨ r) = (¬p ∧ p) ∨ (¬p ∧ r) ∨ (q ∧ p) ∨ (q ∧ r)
3、根據德摩根定律,對含有「非」運算符的變數進行變形,得到不含有「非」運算符的項:
(¬p ∧ p) ∨ (¬p ∧ r) ∨ (q ∧ p) ∨ (q ∧ r) = (q ∧ p) ∨ (¬p ∧ r)
4、示例代碼
function toDNF(expr) { // 將「與」運算符轉化為「或」運算符 expr = expr.replace(/∧/g, '∨'); // 對含有「非」運算符的變數進行變形 let matches = null; let re = /¬?\w+/g; while ((matches = re.exec(expr)) !== null) { let variable = matches[0]; if (variable.charAt(0) === '¬') { let pos = expr.indexOf(variable); let start = pos - 1; let length = variable.length + 1; if (pos === 0) { expr = expr.substring(length); } else if (expr.charAt(start) === '∨') { expr = expr.substring(0, start) + expr.substring(start + length); } else if (expr.charAt(start) === '∧') { let left = expr.substring(0, start); let right = expr.substring(pos + length); expr = left + '¬' + variable.substring(1) + '∨' + '¬(' + variable.substring(1) + ')' + right; } } } // 將多個變數的「或」運算符進行合併 expr = expr.split('∨').filter(function (item, pos, self) { return self.indexOf(item) === pos; }).join('∨'); return expr; } console.log(toDNF('(p → q) ∧ (¬p ∨ r)'));
二、合取範式
1、什麼是合取範式?
在命題邏輯中,合取範式是由若干個含有變數的合取式進行「或」運算而得到的命題。
2、合取範式的含義
如果一個命題是由多個命題「與」起來的,則我們可以將其表示為一個含有變數的合取式。
例如:
((p1 ∧ ¬p2) ∨ (¬p1 ∧ p2))
這個式子可以表示為:如果 p1 與 ¬p2 同時成立,或者 ¬p1 與 p2 同時成立,那麼命題就成立。
3、如何將一個命題轉化為它的合取範式?
我們可以使用以下步驟將一個命題轉化為它的合取範式:
1、將命題中的「或」運算符轉化為「與」運算符;
2、根據「與」運算符的結合律,將多個變數的「與」運算符進行合併;
3、根據德摩根定律,對含有「非」運算符的變數進行變形,得到不含有「非」運算符的項。
例如,對於命題(p → q) ∧ (¬p ∨ r),我們可以按以下步驟轉化為合取範式:
1、將命題中的「或」運算符轉化為「與」運算符:
(p → q) ∧ (¬p ∨ r) = (¬p ∨ q) ∧ (p ∨ r)
2、根據「與」運算符的結合律,將多個變數的「與」運算符進行合併:
(¬p ∨ q) ∧ (p ∨ r) = (¬p ∨ q ∨ r) ∧ (p ∨ q ∨ r)
3、根據德摩根定律,對含有「非」運算符的變數進行變形,得到不含有「非」運算符的項:
(¬p ∨ q ∨ r) ∧ (p ∨ q ∨ r) = ((¬p ∨ q ∨ r) ∧ p) ∨ ((¬p ∨ q ∨ r) ∧ (¬p))
4、示例代碼
function toCNF(expr) { // 將「或」運算符轉化為「與」運算符 expr = expr.replace(/∨/g, '∧'); // 對含有「非」運算符的變數進行變形 let matches = null; let re = /¬?\w+/g; while ((matches = re.exec(expr)) !== null) { let variable = matches[0]; if (variable.charAt(0) === '¬') { let pos = expr.indexOf(variable); let start = pos - 1; let length = variable.length + 1; if (pos === 0) { expr = expr.substring(length); } else if (expr.charAt(start) === '∨') { let left = expr.substring(0, start); let right = expr.substring(pos + length); expr = left + '¬' + variable.substring(1) + '∧' + '¬(' + variable.substring(1) + ')' + right; } else if (expr.charAt(start) === '∧') { expr = expr.substring(0, start) + expr.substring(start + length); } } } // 將多個變數的「與」運算符進行合併 expr = expr.split('∧').filter(function (item, pos, self) { return self.indexOf(item) === pos; }).join('∧'); return expr; } console.log(toCNF('(p → q) ∧ (¬p ∨ r)'));
三、小結
在命題邏輯中,析取範式和合取範式是兩種標準化的命題表達方式。通過將一個命題轉化為它的析取範式或合取範式,我們可以快速簡化命題,從而更方便地進行推理和計算。在實際編程中,我們可以編寫相關函數,幫助我們將命題轉化為它的標準化表達形式。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/252041.html