【Swift】16種類の論理結合子

Bool値を二つとる論理演算である論理結合子は、
解の取り方が16種類(2の4乗通り)あるので、Swiftで表現してみました。

# 矛盾

![Contradiction.png](https://qiita-image-store.s3.amazonaws.com/0/84014/7ea0f052-5d18-6c50-65fe-05bfe4d2ea29.png)


```swift
func contradiction(p: Bool, q: Bool) -> Bool {
    return false
}
```

# トートロジー

![Tautology.png](https://qiita-image-store.s3.amazonaws.com/0/84014/8f750824-162d-e369-cb48-26f1d97770c3.png)

```swift
func tautology(p: Bool, q: Bool) -> Bool {
    return true
}
```

# 命題P

![PropositionP.png](https://qiita-image-store.s3.amazonaws.com/0/84014/35618d71-895a-a8d8-b978-165bd1bd2527.png)

```swift
func propositionP(p: Bool, q: Bool) -> Bool {
    return p
}
```

# 否定P

![NegationOfP.png](https://qiita-image-store.s3.amazonaws.com/0/84014/3fbdfd86-aed2-db25-590b-c235201792c1.png)

```swift
func negationOfP(p: Bool, q: Bool) -> Bool {
    return !p
}
```

# 命題Q

![PropositionQ.png](https://qiita-image-store.s3.amazonaws.com/0/84014/9c43441d-f93e-f306-d4c5-dfcf5226fca0.png)

```swift
func propositionQ(p: Bool, q: Bool) -> Bool {
    return q
}
```

# 否定Q

![NegationOfQ.png](https://qiita-image-store.s3.amazonaws.com/0/84014/14ca36a0-ff6e-6fdc-6ea3-14d5e81418b7.png)

```swift
func negationOfQ(p: Bool, q: Bool) -> Bool {
    return !q
}
```

# 論理積

![Conjunction.png](https://qiita-image-store.s3.amazonaws.com/0/84014/cb466f19-ddaf-b857-ec51-19eb7c167d63.png)

```swift
func conjunction(p: Bool, q: Bool) -> Bool {
    return p && q
}
```

# 否定論理積

![AlternativeDenial.png](https://qiita-image-store.s3.amazonaws.com/0/84014/83794e03-2a25-60ec-98b2-23715aaa2b03.png)

```swift
func alternativeDenial(p: Bool, q: Bool) -> Bool {
    return !p || !q
}
```

# 論理和

![Disjunction.png](https://qiita-image-store.s3.amazonaws.com/0/84014/8acb269c-41ff-b797-ea84-f69b56cb65f8.png)

```swift
func disjunction(p: Bool, q: Bool) -> Bool {
    return p || q
}
```

# 否定論理和

![JointDenial.png](https://qiita-image-store.s3.amazonaws.com/0/84014/eaee3ee1-ac7a-7ab6-c42f-eb7c32f12bde.png)

```swift
func jointDenial(p: Bool, q: Bool) -> Bool {
    return !p && !q
}
```

# 非含意

![MaterialNonImplication.png](https://qiita-image-store.s3.amazonaws.com/0/84014/db3dfa1b-2ca7-7d1f-28bd-8c561f335681.png)

```swift
func materialNonInplication(p: Bool, q: Bool) -> Bool {
    return p && !q
}
```

# 否定含意(条件式)

![MaterialImplication.png](https://qiita-image-store.s3.amazonaws.com/0/84014/3ee5c313-c459-f8d3-d3fb-8c80d48c1dac.png)

```swift
func materialInplication(p: Bool, q: Bool) -> Bool {
    return !p || q
}
```

# 逆非含意

![ConverseNonImplication.png](https://qiita-image-store.s3.amazonaws.com/0/84014/e61fc774-7964-0861-b404-46b186375abf.png)

```swift
func converseNonImplication(p: Bool, q: Bool) -> Bool {
    return !p && q
}
```

# 逆含意

![ConverseImplication.png](https://qiita-image-store.s3.amazonaws.com/0/84014/56b11f5e-e7b8-988a-580f-741d7c594035.png)

```swift
func converseImplication(p: Bool, q: Bool) -> Bool {
    return p || !q
}
```

# 排他的論理和

![ExclusiveDisjunction.png](https://qiita-image-store.s3.amazonaws.com/0/84014/d1b07a20-2d1c-ef36-410e-b29652a3ad98.png)

```swift
func exclusiveDisjunction(p: Bool, q: Bool) -> Bool {
    return (p && !q) || (!p && q)
}
```

# 同値(必要十分条件)

![Biconditional.png](https://qiita-image-store.s3.amazonaws.com/0/84014/4649832f-b1d5-b430-5c6b-379813ddb406.png)

```swift
func biconditional(p: Bool, q: Bool) -> Bool {
    return (p && q) || (!p && !q)
}
```

# XOR演算子
排他的論理和の演算子を定義してみました。
ビット演算には^の演算子があるので、^^を使いました。
また優先順位はビット演算に習い、||と同等の110としました。

```swift
infix operator ^^ { associativity left precedence 110 }
func ^^ (lhs: Bool, rhs: Bool) -> Bool {
    return exclusiveDisjunction(p: lhs, q: rhs) // または (p && !q) || (!p && q)
}
```

**実行結果**

```swift
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