Bool値を二つとる論理演算である論理結合子は、
解の取り方が16種類(2の4乗通り)あるので、Swiftで表現してみました。
矛盾
func contradiction(p: Bool, q: Bool) -> Bool {
return false
}
トートロジー
func tautology(p: Bool, q: Bool) -> Bool {
return true
}
命題P
func propositionP(p: Bool, q: Bool) -> Bool {
return p
}
否定P
func negationOfP(p: Bool, q: Bool) -> Bool {
return !p
}
命題Q
func propositionQ(p: Bool, q: Bool) -> Bool {
return q
}
否定Q
func negationOfQ(p: Bool, q: Bool) -> Bool {
return !q
}
論理積
func conjunction(p: Bool, q: Bool) -> Bool {
return p && q
}
否定論理積
func alternativeDenial(p: Bool, q: Bool) -> Bool {
return !p || !q
}
論理和
func disjunction(p: Bool, q: Bool) -> Bool {
return p || q
}
否定論理和
func jointDenial(p: Bool, q: Bool) -> Bool {
return !p && !q
}
非含意
func materialNonInplication(p: Bool, q: Bool) -> Bool {
return p && !q
}
否定含意(条件式)
func materialInplication(p: Bool, q: Bool) -> Bool {
return !p || q
}
逆非含意
func converseNonImplication(p: Bool, q: Bool) -> Bool {
return !p && q
}
逆含意
func converseImplication(p: Bool, q: Bool) -> Bool {
return p || !q
}
排他的論理和
func exclusiveDisjunction(p: Bool, q: Bool) -> Bool {
return (p && !q) || (!p && q)
}
同値(必要十分条件)
func biconditional(p: Bool, q: Bool) -> Bool {
return (p && q) || (!p && !q)
}
XOR演算子
排他的論理和の演算子を定義してみました。
ビット演算には^の演算子があるので、^^を使いました。
また優先順位はビット演算に習い、||と同等の110としました。
infix operator ^^ { associativity left precedence 110 }
func ^^ (lhs: Bool, rhs: Bool) -> Bool {
return exclusiveDisjunction(p: lhs, q: rhs) // または (p && !q) || (!p && q)
}
実行結果
true ^^ true // false
true ^^ false // true
false ^^ true // true
false ^^ false // false
おわりに
実用性はあまりありません😊
gist→https://gist.github.com/KentaKudo/f68bbfadb4169ab1e46519ff399b30dd
参考
https://ja.wikipedia.org/wiki/論理演算#.E8.AB.96.E7.90.86.E7.B5.90.E5.90.88.E5.AD.90
http://qiita.com/KentaKudo/items/a1dd2eb0bf37302c1c81
https://en.wikipedia.org/wiki/Truth_function#Table_of_binary_truth_functions