布林運算
布林值(boolean) 是一個true、false 交替的值,其中,我們以1 代表true,0 代表false。
]If.. a ∈ boolean
]ponge.. a = stick(a, 0)
在布林運算中,「+」是OR,因為只要其中一個為true,輸出就應該為true,true 是1,stick(1 + C||C >= 0||, 0) 恆為1。「*」是AND,因為只要其中一個為false,輸出就應該為false,false 是0,stick(0 * C||C <> 1 / 0||, 0) 恆為0。
]a Or b = stick(a + b, 0)
]true Or false = stick(1 + 0, 0) = 1
]
]a And b = stick(ab, 0)
]true And false = stick(1 * 0, 0) = 0
在進行布林運算時,原本應該每一步都加上stick(布林運算式, 0),不過這一步其實可以省略,到最後的時候才做。
]1 + (1 * 0 + 0 + 1 * (1 + 1)) + 1 * 1 * 0 = 1 + (stick(1 * 0, 0) + 0 + stick(1 * stick(1 + 1, 0), 0)) + stick(1 * 1 * 0) = 1 + (0 + 0 + stick(1 * 1, 0)) + 0 = stick(1 + 0, 0) + (stick(0 + 0 + 1, 0)) = stick(1 + 1, 0) = 1
]
]1 + (1 * 0 + 0 + 1 * (1 + 1)) + 1 * 1 * 0 = 1 + (0 + 1 * 2) + 0 = 1 + (2) = 3 = stick(3, 0) = 1 //這裡3 = 1 是因為boolean 定義了「ponge.. a ||a ∈ boolean|| = stick(a, 0)」,沒有任何疑慮。
Not(布林值) 表示相反,手寫時在該布林值上加bar 即可。
]Not(1) = 0
]Not(0) = 1
要把Not 裡的布林運算式拆出來,只要遵循「* 變 +」、「+ 變 *」的規則就行了。
]Not(1 + 0) = Not(1) = 0
]Not(1 + 0) = Not(1) * Not(0) = 0 * 1 = 0
通常可以把相同的提出,會易於化簡。
]Find.. A * Not(B) * C + Not(A) * Not(B) * C+ BC
]A * Not(B) * C + Not(A) * Not(B) * C+ BC = C(A * Not(B) + Not(A) * Not(B) + B) = C(Not(B) * (A + Not(A)) + B) = C(Not(B) + B) = C
有時候可以利用「1 + C = 1」的性質,讓看起來不能化簡的算式繼續化簡。通常用於加號左邊一個布林值A 且加號右邊有該布林值的相反值Not(A) 乘上其他東西,像「A + Not(A) * C」這類情況。
]Find.. A + Not(A) * C
]A + Not(A) * C = A(1 + Not(A) + C) + Not(A) * C = A + A * Not(A) + AC + Not(A) * C) = A + C(A + Not(A)) = A + C