【初心者向け】集合論①部分集合(subset)と真部分集合(proper subset)について。


[【Rで球面幾何学】等比数列(算術数列)① 数直線(Number Line)概念の導入(Introduction)について。](https://qiita.com/ochimusha01/items/4e5eca346c85f161c3b7)
![数直線010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597772/34eb291e-1900-f23f-3a37-eba556fb5923.png)
上掲の投稿では、以下の概念の**導入**(<font color="blue">Introduce</font>)を余儀なくされました。

1. **自然数列**(<font color="blue">Natural sequence</font>)は**整数列**(<font color="blue">Integer sequence</font>)の**真部分集合**(<font color="blue">proper subset</font>)として存在する。
2. **偶数列**(<font color="blue">Even sequence</font>)や**奇数列**(<font color="blue">Odd sequence</font>)もまた整数列の真部分集合として存在する。

まぁ、一連の投稿の舞台に選んだ**加算直積可能世界**(<font color="blue">The Countable and Productable Sets</font>)における<font color="green">Sets</font>(<font color="blue">単数形Set</font>)概念の大源流でもあるので無碍には出来ないのです。
[部分集合 - Wikipedia](https://ja.wikipedia.org/wiki/%E9%83%A8%E5%88%86%E9%9B%86%E5%90%88)
[集合の記号の意味まとめ](https://mathtrain.jp/setsnotation)
>集合 A の要素がすべて集合 B の要素でもあるとき、すなわち、
><font color="green">∀x(x∈A→x∈B)</font>
>が成り立つとき、A は B の部分集合であるといい、
><font color="green">A⊆B</font>
>で表す。A が B の部分集合であることを
>「**AはBに**（<font color="blue">部分集合として</font>）**含まれる**（<font color="blue">contained;包含される</font>）」
>「**AはBに包まれる**（<font color="blue">included;包摂あるいは内包される</font>）」
などということもある。
またこのときBはAの**上位集合**（<font color="blue">superset</font>）であるということもある。
要するにAは集合Bの**要素**(<font color="blue">element</font>)でもある。
>
>B以外の集合でBの部分集合であるようなものは、Bの**真部分集合**(<font color="blue">proper subset</font>)あるいは**狭義**（<font color="blue">strict;強い意味で</font>）の部分集合と呼ばれる。すなわち、集合Aが集合Bの真部分集合であるとは<font color="green">A⊆BかつA≠B</font>が成り立つことである。AがBの真部分集合であることを
><font color="green">A⊂B</font>
>で表す。

```R
#整数列(-6~6)
> Z0<-seq(-6L,6L,by=1L)
> Z0
 [1] -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6

#自然数列(1~6)
> N0<-seq(1L,6L,by=1L)
> N0
[1] 1 2 3 4 5 6

#偶数列(1~6)
> E0<-seq(-6L,6L,by=2L)
> E0
[1] -6 -4 -2  0  2  4  6

#奇数列(1~6)
> O0<-seq(-5L,5L,by=2L)
> O0
[1] -5 -3 -1  1  3  5

#intersect(A,B)関数
#両方にふくまれている文字列を抽出する（Aにもあって、Bにもある）
> intersect(Z0,N0)
[1] 1 2 3 4 5 6
> intersect(Z0,E0)
[1] -6 -4 -2  0  2  4  6
> intersect(Z0,O0)
[1] -5 -3 -1  1  3  5

#setdiff(A,B)関数
#Aのみにふくまれている文字列を抽出する（Aにあって、Bにない）
> setdiff(Z0,N0)
[1] -6 -5 -4 -3 -2 -1  0
> setdiff(Z0,E0)
[1] -5 -3 -1  1  3  5
> setdiff(Z0,O0)
[1] -6 -4 -2  0  2  4  6

#setdiff(B,A)関数
#Bのみにふくまれている文字列を抽出する（Bにあって、Aにない）
> setdiff(N0,Z0)
integer(0)#長さ0の空集合
> setdiff(E0,Z0)
integer(0)#長さ0の空集合
> setdiff(O0,Z0)
integer(0)#長さ0の空集合

#全て真部分集合関係なのでこうなる。
```
Rでの集合操作については、こんなサイトも。
[Rで集合操作を色々やっておく](https://www.yasuhisay.info/entry/20080913/1221272524)

```R
#集合を直積する関数
write.direct.product <- function(x,y){
  e <- expand.grid(x,y)
  m <- mapply(function(x,y){paste("(",x,",",y,")",sep="")},e[,1],e[,2])
  return(paste("{",paste(m,collapse=","),"}",sep=""))
}
#動作例
> write.direct.product(1:3,4:6)
[1] "{(1,4),(2,4),(3,4),(1,5),(2,5),(3,5),(1,6),(2,6),(3,6)}"

#冪集合を生成する関数。
write.list <- function(list){
  write.vector <- function(vector){
    return(paste("{",paste(vector,collapse=","),"}",sep=""))
  }
  write.list.intern <- function(list){
    ifelse(is.list(list),Reduce(function(init,x){paste(init,write.list.intern(x),sep="")},list,""),write.vector(list))
  }
  gsub("NA","",paste("{",gsub("\\}\\{","\\},\\{",write.list.intern(list)),"}",sep=""))
}
#動作例
> write.list(list("a","b","c","d",list(1:10,list(1,2))))
[1] "{{a},{b},{c},{d},{1,2,3,4,5,6,7,8,9,10},{1},{2}}"
```
とりあえず以下続報…