檢視原始碼 sofs (stdlib v6.2)

用於操作集合的集合的函式。

此模組提供對有限集合和以集合表示的關係的操作。直觀來說,集合是元素的集合;每個元素都屬於該集合,且該集合包含每個元素。

此模組使用的代表 sofs 的資料應被其他模組視為不透明。在抽象術語中,表示法是現有 Erlang 項的複合類型。請參閱關於資料類型的注意事項。任何假設了解格式的程式碼都如同在薄冰上行走。

給定一個集合 A 和一個句子 S(x),其中 x 是一個自由變數,可以形成一個新的集合 B,其元素恰好是 A 中滿足 S(x) 的那些元素,這表示為 B = {x 在 A : S(x)}。句子使用邏輯運算符「存在」(或「至少有一個」)、「對於所有」、「且」、「或」、「非」來表示。如果已知存在包含所有指定元素的集合(如本模組中總是如此),則表示為 B = {x : S(x)}。

  • 包含元素 a、b 和 c 的無序集合表示為 {a, b, c}。此符號不要與元組混淆。

    a 和 b 的有序對,第一個座標是 a,第二個座標是 b,表示為 (a, b)。有序對是包含兩個元素的有序集合。在此模組中,有序集合可以包含一個、兩個或更多個元素,並使用括號來括住這些元素。

    無序集合和有序集合是正交的,再次在此模組中;沒有無序集合等於任何有序集合。

  • 空集合不包含任何元素。

    如果集合 A 和集合 B 包含相同的元素,則集合 A 等於集合 B,表示為 A = B。如果兩個有序集合包含相同數量的元素,且每個座標上的元素都相等,則它們相等。

    如果 A 包含 B 包含的所有元素,則集合 B 是集合 A 的子集

    兩個集合 A 和 B 的聯集是包含 A 的所有元素和 B 的所有元素的最小集合。

    兩個集合 A 和 B 的交集是包含 A 中屬於 B 的所有元素的集合。

    如果兩個集合的交集是空集合,則稱這兩個集合是不相交的

    兩個集合 A 和 B 的差集是包含 A 中不屬於 B 的所有元素的集合。

    兩個集合的對稱差是包含屬於其中一個集合但不屬於兩個集合的元素的集合。

    一個集合集合的聯集是包含屬於該集合集合中至少一個集合的所有元素的最小集合。

    一個非空集合集合的交集是包含屬於該集合集合中每個集合的所有元素的集合。

  • 兩個集合 X 和 Y 的笛卡爾積,表示為 X × Y,是集合 {a : a = (x, y),對於某些 x 在 X 中,且對於某些 y 在 Y 中}。

    關係是 X × Y 的子集。令 R 為一個關係。事實 (x, y) 屬於 R 寫成 x R y。由於關係是集合,因此最後一個項目(子集、聯集等等)的定義也適用於關係。

    R 的定義域是集合 {x : 對於某些 y 在 Y 中,x R y}。

    R 的值域是集合 {y : 對於某些 x 在 X 中,x R y}。

    R 的逆關係是集合 {a : a = (y, x),對於某些 (x, y) 在 R 中}。

    如果 A 是 X 的子集,則 A 在 R 下的是集合 {y : 對於某些 x 在 A 中,x R y}。如果 B 是 Y 的子集,則 B 的逆像是集合 {x : 對於某些 y 在 B 中,x R y}。

    如果 R 是從 X 到 Y 的關係,而 S 是從 Y 到 Z 的關係,則 R 和 S 的相對乘積是從 X 到 Z 的關係 T,其定義為 x T z 若且唯若在 Y 中存在一個元素 y,使得 x R y 且 y S z。

    R 對 A 的限制是集合 S,其定義為 x S y 若且唯若在 A 中存在一個元素 x,使得 x R y。

    如果 S 是 R 對 A 的限制,則 R 是 S 對 X 的擴展

    如果 X = Y,則 R 稱為 in X 的關係。

    X 中關係 R 的是 R 的定義域和 R 的值域的聯集。

    如果 R 是 X 中的關係,且如果 S 的定義為 x S y 如果 x R y 且非 x = y,則 S 是對應於 R 的嚴格關係。相反地,如果 S 是 X 中的關係,且如果 R 的定義為 x R y 如果 x S y 或 x = y,則 R 是對應於 S 的關係。

    如果對於 X 的每個元素 x,x R x,則 X 中的關係 R 是自反的;如果 x R y 意味著 y R x,則它是對稱的;如果 x R y 且 y R z 意味著 x R z,則它是傳遞的

  • 函數 F 是一種關係,即 X × Y 的子集,使得 F 的定義域等於 X,並且對於 X 中的每個 x,在 Y 中都存在一個唯一的元素 y,使得 (x, y) 在 F 中。後一個條件可以表述如下:如果 x F y 且 x F z,則 y = z。在此模組中,不要求 F 的定義域等於 X 才能將關係視為函數。

    當 F 是函數時,我們寫 F(x) = y,而不是寫 (x, y) 在 F 中或 x F y,並說 F 將 x 映射到 y,或說 F 在 x 處的值為 y。

    由於函數是關係,因此最後一個項目(定義域、值域等等)的定義也適用於函數。

    如果函數 F 的逆關係是函數 F',則 F' 稱為 F 的反函數

    如果 F1 的值域是 F2 的定義域的子集,則兩個函數 F1 和 F2 的相對乘積稱為 F1 和 F2 的複合

  • 有時,當函數的值域比函數本身更重要時,該函數稱為

    族的定義域稱為索引集,而值域稱為索引集

    如果 x 是從 I 到 X 的族,則 x[i] 表示該函數在索引 i 處的值。符號「X 中的族」用於表示此類族。

    當索引集是集合 X 的子集集合時,我們稱 x 為 X 的子集族

    如果 x 是 X 的子集族,則 x 值域的聯集稱為 x 的聯集。

    如果 x 非空(索引集非空),則 x 的交集是 x 值域的交集。

    在此模組中,唯一考慮的族是某些集合 X 的子集族;在下文中,「族」一詞用於表示此類子集族。

  • 集合 X 的分割是 X 的非空子集的集合 S,其聯集是 X,且其元素是成對不相交的。

    集合中的關係如果自反、對稱和傳遞,則它是等價關係

    如果 R 是 X 中的等價關係,且 x 是 X 的元素,則 x 相對於 R 的等價類是使得 x R y 成立的所有 X 的元素 y 的集合。等價類構成 X 的分割。反之,如果 C 是 X 的分割,則如果 X 的任何兩個元素屬於同一個等價類,則關係成立,是由分割 C 引起的等價關係。

    如果 R 是 X 中的等價關係,則標準映射是將 X 的每個元素映射到其等價類的函數。

  • 上述定義的關係(作為有序對的集合)從現在起稱為二元關係

    我們稱有序集合 (x[1], ..., x[n]) 的集合為(n 元)關係,並說該關係是笛卡爾積 X[1] × ... × X[n] 的子集,其中 x[i] 是 X[i] 的元素,1 <= i <= n。

    n 元關係 R 對座標 i 的投影是集合 {x[i] : 對於某些 x[j] 在 X[j] 中,(x[1], ..., x[i], ..., x[n]) 在 R 中,1 <= j <= n 且非 i = j}。二元關係 R 對第一個和第二個座標的投影分別是 R 的定義域和值域。

    二元關係的相對乘積可以推廣到 n 元關係,如下所示。令 TR 為從 X 到 Y[i] 的二元關係 (R[1], ..., R[n]) 的有序集合,而 S 為從 (Y[1] × ... × Y[n]) 到 Z 的二元關係。TR 和 S 的相對乘積是從 X 到 Z 的二元關係 T,其定義為 x T z 若且唯若對於每個 1 <= i <= n,在 Y[i] 中存在一個元素 y[i],使得 x R[i] y[i] 且 (y[1], ..., y[n]) S z。現在令 TR 為從 X[i] 到 Y[i] 的二元關係 (R[1], ..., R[n]) 的有序集合,而 S 為 X[1] × ... × X[n] 的子集。TR 和 S 的多重相對乘積定義為集合 {z : z = ((x[1], ..., x[n]), (y[1],...,y[n])),對於某些 (x[1], ..., x[n]) 在 S 中,且對於某些 (x[i], y[i]) 在 R[i] 中,1 <= i <= n}。

    n 元關係 R 和 m 元關係 S 在座標 i 和 j 上的自然聯接定義為集合 {z : z = (x[1], ..., x[n],  y[1], ..., y[j-1], y[j+1], ..., y[m]),對於某些 (x[1], ..., x[n]) 在 R 中,且對於某些 (y[1], ..., y[m]) 在 S 中,使得 x[i] = y[j]}。

  • 此模組識別的集合由關係 Sets 的元素表示,該關係定義為最小集合,使得

    • 對於每個原子 T,除了 '_',和每個項 X,(T, X) 屬於 Sets(原子集合)。
    • (['_'], []) 屬於 Sets(未類型化的空集合)。
    • 對於每個元組 T = {T[1], ..., T[n]} 和每個元組 X = {X[1], ..., X[n]},如果對於每個 1 <= i <= n,(T[i], X[i]) 屬於 Sets,則 (T, X) 屬於 Sets(有序集合)。
    • 對於每個項 T,如果 X 是空列表,或是不含重複元素的非空排序列表 [X[1], ..., X[n]],使得對於每個 1 <= i <= n,(T, X[i]) 都屬於 Sets,則 ([T], X) 屬於 Sets(帶型別的無序集合)。

    一個外部集合是 Sets 的值域中的一個元素。

    一個類型是 Sets 的定義域中的一個元素。

    如果 S 是 Sets 的一個元素 (T, X),則 T 是 X 的一個有效類型,T 是 S 的類型,而 X 是 S 的外部集合。from_term/2 從類型和轉換成外部集合的 Erlang 項建立一個集合。

    Sets 表示的集合是從 Sets 到 Erlang 項和 Erlang 項集合的函數 Set 的值域中的元素

    • Set(T,Term) = Term,其中 T 是一個原子
    • Set({T[1], ..., T[n]}, {X[1], ...,  X[n]}) = (Set(T[1], X[1]), ...,  Set(T[n], X[n]))
    • Set([T], [X[1], ..., X[n]]) = {Set(T, X[1]), ..., Set(T, X[n])}
    • Set([T], []) = {}

    當沒有混淆的風險時,Sets 的元素會與它們所代表的集合識別。例如,如果 U 是使用 S1 和 S2 作為參數呼叫 union/2 的結果,則稱 U 為 S1 和 S2 的聯集。更精確的表述是 Set(U) 是 Set(S1) 和 Set(S2) 的聯集。

類型用於實作集合必須滿足的各種條件。例如,考慮兩個集合 R 和 S 的相對乘積,回想一下,如果 R 是到 Y 的二元關係,而 S 是從 Y 的二元關係,則定義 R 和 S 的相對乘積。實作相對乘積的函式 relative_product/2,會透過將 [{A,B}] 與第一個引數(假設為 Arg1)的類型匹配,並將 [{C,D}] 與第二個引數(假設為 Arg2)的類型匹配來檢查引數是否表示二元關係。[{A,B}] 與 Arg1 的類型匹配的事實應該被解釋為 Arg1 表示從 X 到 Y 的二元關係,其中 X 被定義為所有 Set(x) 集合,對於某些類型為 A 的 Sets 中的元素 x,Y 的定義方式類似。以相同的方式,Arg2 被解釋為表示從 W 到 Z 的二元關係。最後,檢查 B 是否與 C 匹配,這足以確保 W 等於 Y。未鍵入的空集合會單獨處理:它的類型 ['_'] 會與任何無序集合的類型匹配。

此模組的一些函數(drestriction/3family_projection/2partition/2partition_family/2projection/2restriction/3substitution/2)接受 Erlang 函數作為修改給定無序集合的每個元素的方式。 這個函數(以下稱為 SetFun)可以指定為函數物件 (fun)、元組 {external, Fun} 或整數

  • 如果 SetFun 被指定為 fun,則 fun 會應用於給定集合的每個元素,並且傳回值會被假設為一個集合。
  • 如果 SetFun 被指定為元組 {external, Fun},則 Fun 會應用於給定集合的每個元素的外部集合,並且傳回值會被假設為外部集合。在本實作中,將無序集合的元素選取為外部集合,並從外部集合的列表組裝新的無序集合,比將每個元素修改為集合更有效率。但是,只有在無序集合的元素是原子或排序集合時,才能使用此最佳化。也必須符合以下條件:元素的類型與 Fun 的某些子句匹配(所建立集合的類型是將 Fun 應用於給定集合的類型的結果),並且 Fun 除了選取、複製或重新排列元素的部分之外,不做其他事情。
  • 將 SetFun 指定為整數 I 等效於指定 {external, fun(X) -> element(I, X) end},但建議使用,因為這樣可以更有效率地處理這種情況。

SetFuns 的範例

fun sofs:union/1
fun(S) -> sofs:partition(1, S) end
{external, fun(A) -> A end}
{external, fun({A,_,C}) -> {C,A} end}
{external, fun({_,{_,C}}) -> C end}
{external, fun({_,{_,{_,E}=C}}) -> {E,{E,C}} end}
2

SetFun 應用於無序集合的元素的順序未指定,並且可能會在此模組的未來版本中變更。

此模組的函數的執行時間主要受排序列表所需的時間所影響。當不需要排序時,執行時間在最壞的情況下與輸入引數和傳回值的大小總和成正比。一些函數以常數時間執行:from_external/2is_empty_set/1is_set/1is_sofs_set/1to_external/1 type/1

當給予格式錯誤的引數或類型不相容的集合時,此模組的函數會使用 badargbad_functiontype_mismatch 訊息終止程序。

在比較外部集合時,會使用運算子 ==/2

參見

dictdigraphorddictordsetssets

摘要

類型

任何種類的集合(也包含原子集合)。

族系(子集)。

無序集合的無序集合

元素為 T 類型的元組。

函數

傳回包含元素 (E, Set) 的二元關係,其中 Set 屬於 SetOfSets,而 E 屬於 Set。

傳回函數 Function1Function2複合

建立將集合 Set 的每個元素對應到 AnySet函數

傳回二元關係 BinRel1

傳回集合 Set1Set2差集

從有向圖 Graph 建立族系Graph 的每個頂點 a 由一對 (a, {b[1], ..., b[n]}) 表示,其中 b[i]:s 是 a 的出鄰居。假設 Type 是族系外部集合的有效類型

傳回二元關係 BinRel定義域

傳回二元關係 BinRel1BinRel1Set限制之間的差集。

傳回 Set1 的子集,其中包含那些將 SetFun 應用後,不會在 Set2 中產生元素的元素。

傳回 BinRel1延伸,因此對於 Set 中不屬於 BinRel1定義域的每個元素 E,BinRel2 包含配對 (E, AnySet)。

建立子集族系family(F, T) 等同於 from_term(F, T),如果結果是族系。

如果 Family1Family2族系,則 Family3 是族系,使得索引集合等於 Family1 的索引集合,並且 Family3[i] 是 Family1[i] 和 Family2[i] 之間的差集(如果 Family2 對應 i 的話),否則為 Family1[i]

如果 Family1 是一個族系,並且對於 Family1 的索引集合中的每個 i,Family1[i] 都是一個二元關係,則 Family2 是與 Family1 具有相同索引集合的族系,使得 Family2[i] 是 Family1[i]定義域

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個二元關係,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的範圍

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個集合的集合,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的交集

如果 Family1Family2family,那麼 Family3 是一個 family,其索引集合是 Family1Family2 的索引集合的交集,且 Family3[i] 是 Family1[i] 和 Family2[i] 的交集。

如果 Family1 是一個family,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是以 Family1[i] 作為參數呼叫 SetFun 的結果。

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個二元關係,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的值域

如果 Family1 是一個family,那麼 Family2Family1限制,只包含索引集合中那些將 Fun 應用於 Family1[i] 後回傳 true 的元素 i。如果 Fun 是一個元組 {external, Fun2},那麼 Fun2 會被應用於 Family1[i] 的外部集合,否則 Fun 會被應用於 Family1[i]。

family Family 建立一個有向圖。對於 Family 的每個配對 (a, {b[1], ..., b[n]}),頂點 a 和邊 (a, b[i]),其中 1 <= i <= n,會被加入到新建立的有向圖中。

如果 Family 是一個family,那麼 BinRel 是一個二元關係,包含所有 (i, x) 配對,其中 i 屬於 Family 的索引集合,且 x 屬於 Family[i]。

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個集合的集合,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的聯集

如果 Family1Family2family,那麼 Family3 是一個 family,其索引集合是 Family1Family2 的索引集合的聯集,且 Family3[i] 是 Family1[i] 和 Family2[i] 的聯集(如果兩者都映射 i),否則為 Family1[i] 或 Family2[i]。

回傳二元關係 BinRel範圍

外部集合 ExternalSet類型 Type 建立一個集合。假設 TypeExternalSet 的一個有效類型

回傳包含列表 ListOfSets 中集合的無序集合

通過遍歷詞彙 Term、排序列表、移除重複項,並為獲得的外部集合推導或驗證一個有效類型,來建立 Sets 的元素。

回傳集合 Set1 在二元關係 BinRel 下的

回傳集合的集合 SetOfSets交集

回傳 Set1Set2交集

回傳family Family 的交集。

回傳函數 Function1反函數

回傳 Set1 在二元關係 BinRel 下的反像

如果二元關係 BinRel 是一個函數或無類型空集合,則回傳 true,否則回傳 false

如果 Set1Set2互斥的,則回傳 true,否則回傳 false

如果 AnySet 是一個空的無序集合,則回傳 true,否則回傳 false

如果 AnySet1AnySet2 相等,則回傳 true,否則回傳 false。以下範例顯示當比較集合是否相等時使用 ==/2

如果 AnySet 看起來是一個無序集合,則回傳 true,如果 AnySet 是一個有序集合或原子集合或任何其他詞彙,則回傳 false

如果 Term 看起來是一個無序集合、一個有序集合或一個原子集合,則回傳 true,否則回傳 false

如果 Set1Set2子集,則回傳 true,否則回傳 false

如果詞彙 Term 是一個類型,則回傳 true

回傳關係 Relation1Relation2 在座標 IJ 上的自然聯結

如果 TupleOfBinRels 是一個非空元組 {R[1], ..., R[n]} 的二元關係,且 BinRel1 是一個二元關係,那麼 BinRel2 是有序集合 (R[i], ..., R[n]) 和 BinRel1多重相對乘積

回傳有序或無序集合 ASet 的元素數量。

回傳集合的集合 SetOfSets 的聯集的分割,使得如果兩個元素屬於 SetOfSets 的相同元素,則認為它們相等。

回傳 Set分割,使得如果應用 SetFun 的結果相等,則認為兩個元素相等。

回傳一對集合,將其視為構成一個集合,形成 Set1 的一個分割。如果將 SetFun 應用於 Set1 的元素所產生的結果位於 Set2 中,則該元素屬於 Set3,否則該元素屬於 Set4

回傳family Family,其中索引集合是 Set 的一個分割,使得如果應用 SetFun 的結果是相同的值 i,則認為兩個元素相等。這個 i 是 Family 映射到等價類的索引。

回傳非空集合元組 TupleOfSets笛卡爾積。如果 (x[1], ..., x[n]) 是 n 元關係 Relation 的一個元素,則 x[i] 是從 TupleOfSets 的元素 i 中提取的。

回傳 Set1Set2笛卡爾積

回傳通過將 SetFun 應用於每個元素所產生的結果來替換 Set1 的每個元素所建立的集合。

回傳二元關係 BinRel值域

等同於 relation(Tuples, Type),其中如果存在此類元組,則 Type 使用 Tuples 的第一個元組的大小。

建立一個關係relation(R, T) 等同於 from_term(R, T),如果 T 是一個類型且結果是一個關係。

回傳family Family,使得索引集合等於二元關係 BinRel定義域,且 Family[i] 是 i 的集合在 BinRel 下的

傳回二元關係 BinRel1逆關係與二元關係 BinRel2相對乘積

如果 ListOfBinRels 是一個非空的二元關係列表 [R[1], ..., R[n]],且 BinRel1 是一個二元關係,則 BinRel2 是有序集合 (R[i], ..., R[n]) 與 BinRel1相對乘積

傳回二元關係 BinRel1Set限制

傳回 Set1 的子集合,其中包含將 SetFun 應用於元素後,結果會在 Set2 中的那些元素。

建立一個無序集合。如果結果是無序集合,則 set(L, T) 等同於 from_term(L, T)

傳回一個集合,其中包含 Set1 中所有使 Fun 傳回 true 的元素。如果 Fun 是一個元組 {external, Fun2},則 Fun2 會應用於每個元素的外部集合,否則 Fun 會應用於每個元素。

傳回對應於二元關係 BinRel1嚴格關係

傳回一個函數,其定義域為 Set1。定義域中元素的值是將 SetFun 應用於該元素的結果。

傳回 Set1Set2對稱差(或布林和)。

傳回一個由集合組成的三元組。

傳回原子、有序或無序集合的外部集合

將有序集合 ASet 的元素以集合的元組形式傳回,並將無序集合 ASet 的元素以不含重複項的排序集合列表形式傳回。

傳回原子、有序或無序集合的類型

傳回集合的集合 SetOfSets聯集

傳回 Set1Set2聯集

傳回 Family 的聯集。

傳回 弱關係 W 的子集 S,該弱關係對應於二元關係 BinRel1。令 F 為 BinRel1。子集 S 的定義如下:如果對於 F 中的某些 x 和 F 中的某些 y,x W y,則 x S y。

類型

-type a_function() :: relation().

函數

-opaque a_set()

無序集合

-type anyset() :: ordset() | a_set().

任何種類的集合(也包含原子集合)。

-type binary_relation() :: relation().

二元關係

-type external_set() :: term().

外部集合

-type family() :: a_function().

族系(子集)。

-opaque ordset()

排序集合

-type relation() :: a_set().

n 元關係

-type set_fun() ::
          pos_integer() |
          {external, fun((external_set()) -> external_set())} |
          fun((anyset()) -> anyset()).

SetFun

-type set_of_sets() :: a_set().

無序集合的無序集合

-type spec_fun() :: {external, fun((external_set()) -> boolean())} | fun((anyset()) -> boolean()).
連結至此類型

tuple_of(T)

檢視原始碼 (未匯出)
-type tuple_of(_T) :: tuple().

元素為 T 類型的元組。

-type type() :: term().

類型

函數

-spec a_function(Tuples) -> Function when Function :: a_function(), Tuples :: [tuple()].

等同於 a_function(Tuples, [{atom, atom}])

連結至此函數

a_function(Tuples, Type)

檢視原始碼
-spec a_function(Tuples, Type) -> Function
                    when Function :: a_function(), Tuples :: [tuple()], Type :: type().

建立函數

如果結果是函數,則 a_function(F, T) 等同於 from_term(F, T)

連結至此函數

canonical_relation(SetOfSets)

檢視原始碼
-spec canonical_relation(SetOfSets) -> BinRel
                            when BinRel :: binary_relation(), SetOfSets :: set_of_sets().

傳回包含元素 (E, Set) 的二元關係,其中 Set 屬於 SetOfSets,而 E 屬於 Set。

如果 SetOfSets 是集合 X 的一個分割,且 R 是由 SetOfSets 在 X 中導出的等價關係,則傳回的關係是從 X 到關於 R 的等價類的典型映射

1> Ss = sofs:from_term([[a,b],[b,c]]),
CR = sofs:canonical_relation(Ss),
sofs:to_external(CR).
[{a,[a,b]},{b,[a,b]},{b,[b,c]},{c,[b,c]}]
連結至此函數

composite(Function1, Function2)

檢視原始碼
-spec composite(Function1, Function2) -> Function3
                   when Function1 :: a_function(), Function2 :: a_function(), Function3 :: a_function().

傳回函數 Function1Function2複合

1> F1 = sofs:a_function([{a,1},{b,2},{c,2}]),
F2 = sofs:a_function([{1,x},{2,y},{3,z}]),
F = sofs:composite(F1, F2),
sofs:to_external(F).
[{a,x},{b,y},{c,y}]
連結至此函數

constant_function(Set, AnySet)

檢視原始碼
-spec constant_function(Set, AnySet) -> Function
                           when AnySet :: anyset(), Function :: a_function(), Set :: a_set().

建立將集合 Set 的每個元素對應到 AnySet函數

1> S = sofs:set([a,b]),
E = sofs:from_term(1),
R = sofs:constant_function(S, E),
sofs:to_external(R).
[{a,1},{b,1}]
-spec converse(BinRel1) -> BinRel2 when BinRel1 :: binary_relation(), BinRel2 :: binary_relation().

傳回二元關係 BinRel1

1> R1 = sofs:relation([{1,a},{2,b},{3,a}]),
R2 = sofs:converse(R1),
sofs:to_external(R2).
[{a,1},{a,3},{b,2}]
連結至此函數

difference(Set1, Set2)

檢視原始碼
-spec difference(Set1, Set2) -> Set3 when Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

傳回集合 Set1Set2差集

連結至此函數

digraph_to_family(Graph)

檢視原始碼
-spec digraph_to_family(Graph) -> Family when Graph :: digraph:graph(), Family :: family().

等同於 digraph_to_family(Graph, [{atom, [atom]}])

連結至此函數

digraph_to_family(Graph, Type)

檢視原始碼
-spec digraph_to_family(Graph, Type) -> Family
                           when Graph :: digraph:graph(), Family :: family(), Type :: type().

從有向圖 Graph 建立族系Graph 的每個頂點 a 由一對 (a, {b[1], ..., b[n]}) 表示,其中 b[i]:s 是 a 的出鄰居。假設 Type 是族系外部集合的有效類型

如果 G 是一個有向圖,則 G 的頂點和邊與 family_to_digraph(digraph_to_family(G)) 的頂點和邊相同。

-spec domain(BinRel) -> Set when BinRel :: binary_relation(), Set :: a_set().

傳回二元關係 BinRel定義域

1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
S = sofs:domain(R),
sofs:to_external(S).
[1,2]
連結至此函數

drestriction(BinRel1, Set)

檢視原始碼
-spec drestriction(BinRel1, Set) -> BinRel2
                      when BinRel1 :: binary_relation(), BinRel2 :: binary_relation(), Set :: a_set().

傳回二元關係 BinRel1BinRel1Set限制之間的差集。

1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
S = sofs:set([2,4,6]),
R2 = sofs:drestriction(R1, S),
sofs:to_external(R2).
[{1,a},{3,c}]

drestriction(R, S) 等同於 difference(R, restriction(R, S))

連結至此函數

drestriction(SetFun, Set1, Set2)

檢視原始碼
-spec drestriction(SetFun, Set1, Set2) -> Set3
                      when SetFun :: set_fun(), Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

傳回 Set1 的子集,其中包含那些將 SetFun 應用後,不會在 Set2 中產生元素的元素。

1> SetFun = {external, fun({_A,B,C}) -> {B,C} end},
R1 = sofs:relation([{a,aa,1},{b,bb,2},{c,cc,3}]),
R2 = sofs:relation([{bb,2},{cc,3},{dd,4}]),
R3 = sofs:drestriction(SetFun, R1, R2),
sofs:to_external(R3).
[{a,aa,1}]

drestriction(F, S1, S2) 等同於 difference(S1, restriction(F, S1, S2))

-spec empty_set() -> Set when Set :: a_set().

傳回未鍵入的空集合empty_set/0 等同於 from_term([], ['_'])

連結至此函數

extension(BinRel1, Set, AnySet)

檢視原始碼
-spec extension(BinRel1, Set, AnySet) -> BinRel2
                   when
                       AnySet :: anyset(),
                       BinRel1 :: binary_relation(),
                       BinRel2 :: binary_relation(),
                       Set :: a_set().

傳回 BinRel1延伸,因此對於 Set 中不屬於 BinRel1定義域的每個元素 E,BinRel2 包含配對 (E, AnySet)。

1> S = sofs:set([b,c]),
A = sofs:empty_set(),
R = sofs:family([{a,[1,2]},{b,[3]}]),
X = sofs:extension(R, S, A),
sofs:to_external(X).
[{a,[1,2]},{b,[3]},{c,[]}]
-spec family(Tuples) -> Family when Family :: family(), Tuples :: [tuple()].

等同於 family(Tuples, [{atom, [atom]}])

-spec family(Tuples, Type) -> Family when Family :: family(), Tuples :: [tuple()], Type :: type().

建立子集族系family(F, T) 等同於 from_term(F, T),如果結果是族系。

連結至此函數

family_difference(Family1, Family2)

檢視原始碼
-spec family_difference(Family1, Family2) -> Family3
                           when Family1 :: family(), Family2 :: family(), Family3 :: family().

如果 Family1Family2族系,則 Family3 是族系,使得索引集合等於 Family1 的索引集合,並且 Family3[i] 是 Family1[i] 和 Family2[i] 之間的差集(如果 Family2 對應 i 的話),否則為 Family1[i]

1> F1 = sofs:family([{a,[1,2]},{b,[3,4]}]),
F2 = sofs:family([{b,[4,5]},{c,[6,7]}]),
F3 = sofs:family_difference(F1, F2),
sofs:to_external(F3).
[{a,[1,2]},{b,[3]}]
連結至此函數

family_domain(Family1)

檢視原始碼
-spec family_domain(Family1) -> Family2 when Family1 :: family(), Family2 :: family().

如果 Family1 是一個族系,並且對於 Family1 的索引集合中的每個 i,Family1[i] 都是一個二元關係,則 Family2 是與 Family1 具有相同索引集合的族系,使得 Family2[i] 是 Family1[i]定義域

1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
F = sofs:family_domain(FR),
sofs:to_external(F).
[{a,[1,2,3]},{b,[]},{c,[4,5]}]
-spec family_field(Family1) -> Family2 when Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個二元關係,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的範圍

1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
F = sofs:family_field(FR),
sofs:to_external(F).
[{a,[1,2,3,a,b,c]},{b,[]},{c,[4,5,d,e]}]

family_field(Family1) 等同於 family_union(family_domain(Family1), family_range(Family1))

連結至此函數

family_intersection(Family1)

檢視原始碼
-spec family_intersection(Family1) -> Family2 when Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個集合的集合,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的交集

如果 Family1[i] 對於某些 i 是空集合,則程序會以 badarg 訊息結束。

1> F1 = sofs:from_term([{a,[[1,2,3],[2,3,4]]},{b,[[x,y,z],[x,y]]}]),
F2 = sofs:family_intersection(F1),
sofs:to_external(F2).
[{a,[2,3]},{b,[x,y]}]
連結至此函數

family_intersection(Family1, Family2)

檢視原始碼
-spec family_intersection(Family1, Family2) -> Family3
                             when Family1 :: family(), Family2 :: family(), Family3 :: family().

如果 Family1Family2family,那麼 Family3 是一個 family,其索引集合是 Family1Family2 的索引集合的交集,且 Family3[i] 是 Family1[i] 和 Family2[i] 的交集。

1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
F3 = sofs:family_intersection(F1, F2),
sofs:to_external(F3).
[{b,[4]},{c,[]}]
連結至此函數

family_projection(SetFun, Family1)

檢視原始碼
-spec family_projection(SetFun, Family1) -> Family2
                           when SetFun :: set_fun(), Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是以 Family1[i] 作為參數呼叫 SetFun 的結果。

1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
F2 = sofs:family_projection(fun sofs:union/1, F1),
sofs:to_external(F2).
[{a,[1,2,3]},{b,[]}]
-spec family_range(Family1) -> Family2 when Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個二元關係,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的值域

1> FR = sofs:from_term([{a,[{1,a},{2,b},{3,c}]},{b,[]},{c,[{4,d},{5,e}]}]),
F = sofs:family_range(FR),
sofs:to_external(F).
[{a,[a,b,c]},{b,[]},{c,[d,e]}]
連結至此函數

family_specification(Fun, Family1)

檢視原始碼
-spec family_specification(Fun, Family1) -> Family2
                              when Fun :: spec_fun(), Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,那麼 Family2Family1限制,只包含索引集合中那些將 Fun 應用於 Family1[i] 後回傳 true 的元素 i。如果 Fun 是一個元組 {external, Fun2},那麼 Fun2 會被應用於 Family1[i] 的外部集合,否則 Fun 會被應用於 Family1[i]。

1> F1 = sofs:family([{a,[1,2,3]},{b,[1,2]},{c,[1]}]),
SpecFun = fun(S) -> sofs:no_elements(S) =:= 2 end,
F2 = sofs:family_specification(SpecFun, F1),
sofs:to_external(F2).
[{b,[1,2]}]
連結至此函數

family_to_digraph(Family)

檢視原始碼
-spec family_to_digraph(Family) -> Graph when Graph :: digraph:graph(), Family :: family().

等同於 family_to_digraph(Family, [])

連結至此函數

family_to_digraph(Family, GraphType)

檢視原始碼
-spec family_to_digraph(Family, GraphType) -> Graph
                           when
                               Graph :: digraph:graph(),
                               Family :: family(),
                               GraphType :: [digraph:d_type()].

family Family 建立一個有向圖。對於 Family 的每個配對 (a, {b[1], ..., b[n]}),頂點 a 和邊 (a, b[i]),其中 1 <= i <= n,會被加入到新建立的有向圖中。

GraphType 會傳遞給 digraph:new/1

如果 F 是一個族,則 F 是 digraph_to_family(family_to_digraph(F), type(F)) 的子集。如果 union_of_family(F)domain(F) 的子集,則等式成立。

在無環圖中建立循環會使程序以 cyclic 訊息結束。

連結至此函數

family_to_relation(Family)

檢視原始碼
-spec family_to_relation(Family) -> BinRel when Family :: family(), BinRel :: binary_relation().

如果 Family 是一個family,那麼 BinRel 是一個二元關係,包含所有 (i, x) 配對,其中 i 屬於 Family 的索引集合,且 x 屬於 Family[i]。

1> F = sofs:family([{a,[]}, {b,[1]}, {c,[2,3]}]),
R = sofs:family_to_relation(F),
sofs:to_external(R).
[{b,1},{c,2},{c,3}]
-spec family_union(Family1) -> Family2 when Family1 :: family(), Family2 :: family().

如果 Family1 是一個family,且對於 Family1 索引集合中的每個 i,Family1[i] 是一個集合的集合,那麼 Family2 是一個與 Family1 具有相同索引集合的 family,使得 Family2[i] 是 Family1[i] 的聯集

1> F1 = sofs:from_term([{a,[[1,2],[2,3]]},{b,[[]]}]),
F2 = sofs:family_union(F1),
sofs:to_external(F2).
[{a,[1,2,3]},{b,[]}]

family_union(F) 等同於 family_projection(fun sofs:union/1, F)

連結至此函數

family_union(Family1, Family2)

檢視原始碼
-spec family_union(Family1, Family2) -> Family3
                      when Family1 :: family(), Family2 :: family(), Family3 :: family().

如果 Family1Family2family,那麼 Family3 是一個 family,其索引集合是 Family1Family2 的索引集合的聯集,且 Family3[i] 是 Family1[i] 和 Family2[i] 的聯集(如果兩者都映射 i),否則為 Family1[i] 或 Family2[i]。

1> F1 = sofs:family([{a,[1,2]},{b,[3,4]},{c,[5,6]}]),
F2 = sofs:family([{b,[4,5]},{c,[7,8]},{d,[9,10]}]),
F3 = sofs:family_union(F1, F2),
sofs:to_external(F3).
[{a,[1,2]},{b,[3,4,5]},{c,[5,6,7,8]},{d,[9,10]}]
-spec field(BinRel) -> Set when BinRel :: binary_relation(), Set :: a_set().

回傳二元關係 BinRel範圍

1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
S = sofs:field(R),
sofs:to_external(S).
[1,2,a,b,c]

field(R) 等同於 union(domain(R), range(R))

連結至此函數

from_external(ExternalSet, Type)

檢視原始碼
-spec from_external(ExternalSet, Type) -> AnySet
                       when ExternalSet :: external_set(), AnySet :: anyset(), Type :: type().

外部集合 ExternalSet類型 Type 建立一個集合。假設 TypeExternalSet 的一個有效類型

-spec from_sets(ListOfSets) -> Set when Set :: a_set(), ListOfSets :: [anyset()];
               (TupleOfSets) -> Ordset when Ordset :: ordset(), TupleOfSets :: tuple_of(anyset()).

回傳包含列表 ListOfSets 中集合的無序集合

1> S1 = sofs:relation([{a,1},{b,2}]),
S2 = sofs:relation([{x,3},{y,4}]),
S = sofs:from_sets([S1,S2]),
sofs:to_external(S).
[[{a,1},{b,2}],[{x,3},{y,4}]]

傳回包含非空元組 TupleOfSets 的集合的有序集合

-spec from_term(Term) -> AnySet when AnySet :: anyset(), Term :: term().

等同於 from_term(Term, '_')

-spec from_term(Term, Type) -> AnySet when AnySet :: anyset(), Term :: term(), Type :: type().

通過遍歷詞彙 Term、排序列表、移除重複項,並為獲得的外部集合推導或驗證一個有效類型,來建立 Sets 的元素。

可以透過明確指定的類型 Type 來限制遍歷的深度;原子類型會停止遍歷,如下面的範例所示,其中 "foo"{"foo"} 保持不變

1> S = sofs:from_term([{{"foo"},[1,1]},{"foo",[2,2]}],
                      [{atom,[atom]}]),
   sofs:to_external(S).
[{{"foo"},[1]},{"foo",[2]}]

from_term 可以用於建立原子或有序集合。此類集合的唯一目的是稍後建立無序集合,因為此模組中所有*執行*任何操作的函數都針對無序集合。從有序集合的集合建立無序集合可能是可行的,如果有序集合很大,並且不想透過重建無序集合的元素來浪費堆積。下面的範例顯示可以「逐層」建立集合

1> A = sofs:from_term(a),
S = sofs:set([1,2,3]),
P1 = sofs:from_sets({A,S}),
P2 = sofs:from_term({b,[6,5,4]}),
Ss = sofs:from_sets([P1,P2]),
sofs:to_external(Ss).
[{a,[1,2,3]},{b,[4,5,6]}]

其他建立集合的函數是 from_external/2from_sets/1from_term/2 的特殊情況是 a_function/1,2empty_set/0family/1,2relation/1,2set/1,2

-spec image(BinRel, Set1) -> Set2 when BinRel :: binary_relation(), Set1 :: a_set(), Set2 :: a_set().

回傳集合 Set1 在二元關係 BinRel 下的

1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
S1 = sofs:set([1,2]),
S2 = sofs:image(R, S1),
sofs:to_external(S2).
[a,b,c]
連結至此函數

intersection(SetOfSets)

檢視原始碼
-spec intersection(SetOfSets) -> Set when Set :: a_set(), SetOfSets :: set_of_sets().

回傳集合的集合 SetOfSets交集

如果與空集合的集合相交,則程序會以 badarg 訊息結束。

連結至此函數

intersection(Set1, Set2)

檢視原始碼
-spec intersection(Set1, Set2) -> Set3 when Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

回傳 Set1Set2交集

連結至此函數

intersection_of_family(Family)

檢視原始碼
-spec intersection_of_family(Family) -> Set when Family :: family(), Set :: a_set().

回傳family Family 的交集。

如果與空族相交,則程序會以 badarg 訊息結束。

1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
S = sofs:intersection_of_family(F),
sofs:to_external(S).
[2]
-spec inverse(Function1) -> Function2 when Function1 :: a_function(), Function2 :: a_function().

回傳函數 Function1反函數

1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
R2 = sofs:inverse(R1),
sofs:to_external(R2).
[{a,1},{b,2},{c,3}]
連結至此函數

inverse_image(BinRel, Set1)

檢視原始碼
-spec inverse_image(BinRel, Set1) -> Set2
                       when BinRel :: binary_relation(), Set1 :: a_set(), Set2 :: a_set().

回傳 Set1 在二元關係 BinRel 下的反像

1> R = sofs:relation([{1,a},{2,b},{2,c},{3,d}]),
S1 = sofs:set([c,d,e]),
S2 = sofs:inverse_image(R, S1),
sofs:to_external(S2).
[2,3]
-spec is_a_function(BinRel) -> Bool when Bool :: boolean(), BinRel :: binary_relation().

如果二元關係 BinRel 是一個函數或無類型空集合,則回傳 true,否則回傳 false

連結至此函數

is_disjoint(Set1, Set2)

檢視原始碼
-spec is_disjoint(Set1, Set2) -> Bool when Bool :: boolean(), Set1 :: a_set(), Set2 :: a_set().

如果 Set1Set2互斥的,則回傳 true,否則回傳 false

-spec is_empty_set(AnySet) -> Bool when AnySet :: anyset(), Bool :: boolean().

如果 AnySet 是一個空的無序集合,則回傳 true,否則回傳 false

連結至此函數

is_equal(AnySet1, AnySet2)

檢視原始碼
-spec is_equal(AnySet1, AnySet2) -> Bool
                  when AnySet1 :: anyset(), AnySet2 :: anyset(), Bool :: boolean().

如果 AnySet1AnySet2 相等,則回傳 true,否則回傳 false。以下範例顯示當比較集合是否相等時使用 ==/2

1> S1 = sofs:set([1.0]),
S2 = sofs:set([1]),
sofs:is_equal(S1, S2).
true
-spec is_set(AnySet) -> Bool when AnySet :: anyset(), Bool :: boolean().

如果 AnySet 看起來是一個無序集合,則回傳 true,如果 AnySet 是一個有序集合或原子集合或任何其他詞彙,則回傳 false

請注意,測試是淺層的,並且此函數會針對任何與無序集合的表示形式一致的術語傳回 true。另請參閱關於資料類型的附註。

-spec is_sofs_set(Term) -> Bool when Bool :: boolean(), Term :: term().

如果 Term 看起來是一個無序集合、一個有序集合或一個原子集合,則回傳 true,否則回傳 false

請注意,此函數會針對任何與 sofs 集合的表示形式一致的術語傳回 true。另請參閱關於資料類型的附註。

-spec is_subset(Set1, Set2) -> Bool when Bool :: boolean(), Set1 :: a_set(), Set2 :: a_set().

如果 Set1Set2子集,則回傳 true,否則回傳 false

-spec is_type(Term) -> Bool when Bool :: boolean(), Term :: term().

如果詞彙 Term 是一個類型,則回傳 true

連結至此函數

join(Relation1, I, Relation2, J)

檢視原始碼
-spec join(Relation1, I, Relation2, J) -> Relation3
              when
                  Relation1 :: relation(),
                  Relation2 :: relation(),
                  Relation3 :: relation(),
                  I :: pos_integer(),
                  J :: pos_integer().

回傳關係 Relation1Relation2 在座標 IJ 上的自然聯結

1> R1 = sofs:relation([{a,x,1},{b,y,2}]),
R2 = sofs:relation([{1,f,g},{1,h,i},{2,3,4}]),
J = sofs:join(R1, 3, R2, 1),
sofs:to_external(J).
[{a,x,1,f,g},{a,x,1,h,i},{b,y,2,3,4}]
連結至此函數

multiple_relative_product(TupleOfBinRels, BinRel1)

檢視原始碼
-spec multiple_relative_product(TupleOfBinRels, BinRel1) -> BinRel2
                                   when
                                       TupleOfBinRels :: tuple_of(BinRel),
                                       BinRel :: binary_relation(),
                                       BinRel1 :: binary_relation(),
                                       BinRel2 :: binary_relation().

如果 TupleOfBinRels 是一個非空元組 {R[1], ..., R[n]} 的二元關係,且 BinRel1 是一個二元關係,那麼 BinRel2 是有序集合 (R[i], ..., R[n]) 和 BinRel1多重相對乘積

1> Ri = sofs:relation([{a,1},{b,2},{c,3}]),
R = sofs:relation([{a,b},{b,c},{c,a}]),
MP = sofs:multiple_relative_product({Ri, Ri}, R),
sofs:to_external(sofs:range(MP)).
[{1,2},{2,3},{3,1}]
-spec no_elements(ASet) -> NoElements when ASet :: a_set() | ordset(), NoElements :: non_neg_integer().

回傳有序或無序集合 ASet 的元素數量。

-spec partition(SetOfSets) -> Partition when SetOfSets :: set_of_sets(), Partition :: a_set().

回傳集合的集合 SetOfSets 的聯集的分割,使得如果兩個元素屬於 SetOfSets 的相同元素,則認為它們相等。

1> Sets1 = sofs:from_term([[a,b,c],[d,e,f],[g,h,i]]),
Sets2 = sofs:from_term([[b,c,d],[e,f,g],[h,i,j]]),
P = sofs:partition(sofs:union(Sets1, Sets2)),
sofs:to_external(P).
[[a],[b,c],[d],[e,f],[g],[h,i],[j]]
連結至此函數

partition(SetFun, Set)

檢視原始碼
-spec partition(SetFun, Set) -> Partition when SetFun :: set_fun(), Partition :: a_set(), Set :: a_set().

回傳 Set分割,使得如果應用 SetFun 的結果相等,則認為兩個元素相等。

1> Ss = sofs:from_term([[a],[b],[c,d],[e,f]]),
SetFun = fun(S) -> sofs:from_term(sofs:no_elements(S)) end,
P = sofs:partition(SetFun, Ss),
sofs:to_external(P).
[[[a],[b]],[[c,d],[e,f]]]
連結至此函數

partition(SetFun, Set1, Set2)

檢視原始碼
-spec partition(SetFun, Set1, Set2) -> {Set3, Set4}
                   when
                       SetFun :: set_fun(),
                       Set1 :: a_set(),
                       Set2 :: a_set(),
                       Set3 :: a_set(),
                       Set4 :: a_set().

回傳一對集合,將其視為構成一個集合,形成 Set1 的一個分割。如果將 SetFun 應用於 Set1 的元素所產生的結果位於 Set2 中,則該元素屬於 Set3,否則該元素屬於 Set4

1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
S = sofs:set([2,4,6]),
{R2,R3} = sofs:partition(1, R1, S),
{sofs:to_external(R2),sofs:to_external(R3)}.
{[{2,b}],[{1,a},{3,c}]}

partition(F, S1, S2) 等同於 {restriction(F, S1, S2), drestriction(F, S1, S2)}

連結至此函數

partition_family(SetFun, Set)

檢視原始碼
-spec partition_family(SetFun, Set) -> Family
                          when Family :: family(), SetFun :: set_fun(), Set :: a_set().

回傳family Family,其中索引集合是 Set 的一個分割,使得如果應用 SetFun 的結果是相同的值 i,則認為兩個元素相等。這個 i 是 Family 映射到等價類的索引。

1> S = sofs:relation([{a,a,a,a},{a,a,b,b},{a,b,b,b}]),
SetFun = {external, fun({A,_,C,_}) -> {A,C} end},
F = sofs:partition_family(SetFun, S),
sofs:to_external(F).
[{{a,a},[{a,a,a,a}]},{{a,b},[{a,a,b,b},{a,b,b,b}]}]
-spec product(TupleOfSets) -> Relation when Relation :: relation(), TupleOfSets :: tuple_of(a_set()).

回傳非空集合元組 TupleOfSets笛卡爾積。如果 (x[1], ..., x[n]) 是 n 元關係 Relation 的一個元素,則 x[i] 是從 TupleOfSets 的元素 i 中提取的。

1> S1 = sofs:set([a,b]),
S2 = sofs:set([1,2]),
S3 = sofs:set([x,y]),
P3 = sofs:product({S1,S2,S3}),
sofs:to_external(P3).
[{a,1,x},{a,1,y},{a,2,x},{a,2,y},{b,1,x},{b,1,y},{b,2,x},{b,2,y}]
-spec product(Set1, Set2) -> BinRel when BinRel :: binary_relation(), Set1 :: a_set(), Set2 :: a_set().

回傳 Set1Set2笛卡爾積

1> S1 = sofs:set([1,2]),
S2 = sofs:set([a,b]),
R = sofs:product(S1, S2),
sofs:to_external(R).
[{1,a},{1,b},{2,a},{2,b}]

product(S1, S2) 等同於 product({S1, S2})

連結至此函數

projection(SetFun, Set1)

檢視原始碼
-spec projection(SetFun, Set1) -> Set2 when SetFun :: set_fun(), Set1 :: a_set(), Set2 :: a_set().

回傳通過將 SetFun 應用於每個元素所產生的結果來替換 Set1 的每個元素所建立的集合。

如果 SetFun 是一個數字 i >= 1,且 Set1 是一個關係,則傳回的集合是 Set1 在座標 i 上的投影

1> S1 = sofs:from_term([{1,a},{2,b},{3,a}]),
S2 = sofs:projection(2, S1),
sofs:to_external(S2).
[a,b]
-spec range(BinRel) -> Set when BinRel :: binary_relation(), Set :: a_set().

回傳二元關係 BinRel值域

1> R = sofs:relation([{1,a},{1,b},{2,b},{2,c}]),
S = sofs:range(R),
sofs:to_external(S).
[a,b,c]
-spec relation(Tuples) -> Relation when Relation :: relation(), Tuples :: [tuple()].

等同於 relation(Tuples, Type),其中如果存在此類元組,則 Type 使用 Tuples 的第一個元組的大小。

如果元組是 [],則 Type2

連結至此函數

relation(Tuples, Type)

檢視原始碼
-spec relation(Tuples, Type) -> Relation
                  when N :: integer(), Type :: N | type(), Relation :: relation(), Tuples :: [tuple()].

建立一個關係relation(R, T) 等同於 from_term(R, T),如果 T 是一個類型且結果是一個關係。

如果 Type 是一個整數 N,則會使用 [{atom, ..., atom}])(其中元組大小為 N)作為關係的類型。

連結至此函數

relation_to_family(BinRel)

檢視原始碼
-spec relation_to_family(BinRel) -> Family when Family :: family(), BinRel :: binary_relation().

回傳family Family,使得索引集合等於二元關係 BinRel定義域,且 Family[i] 是 i 的集合在 BinRel 下的

1> R = sofs:relation([{b,1},{c,2},{c,3}]),
F = sofs:relation_to_family(R),
sofs:to_external(F).
[{b,[1]},{c,[2,3]}]
連結至此函數

relative_product1(BinRel1, BinRel2)

檢視原始碼
-spec relative_product1(BinRel1, BinRel2) -> BinRel3
                           when
                               BinRel1 :: binary_relation(),
                               BinRel2 :: binary_relation(),
                               BinRel3 :: binary_relation().

傳回二元關係 BinRel1逆關係與二元關係 BinRel2相對乘積

1> R1 = sofs:relation([{1,a},{1,aa},{2,b}]),
R2 = sofs:relation([{1,u},{2,v},{3,c}]),
R3 = sofs:relative_product1(R1, R2),
sofs:to_external(R3).
[{a,u},{aa,u},{b,v}]

relative_product1(R1, R2) 等同於 relative_product(converse(R1), R2)

連結至此函數

relative_product(ListOfBinRels)

檢視原始碼
-spec relative_product(ListOfBinRels) -> BinRel2
                          when
                              ListOfBinRels :: [BinRel, ...],
                              BinRel :: binary_relation(),
                              BinRel2 :: binary_relation().

等同於 relative_product/2

-spec relative_product(ListOfBinRels, BinRel1) -> BinRel2
                          when
                              ListOfBinRels :: [BinRel, ...],
                              BinRel :: binary_relation(),
                              BinRel1 :: binary_relation(),
                              BinRel2 :: binary_relation();
                      (BinRel1, BinRel2) -> BinRel3
                          when
                              BinRel1 :: binary_relation(),
                              BinRel2 :: binary_relation(),
                              BinRel3 :: binary_relation().

如果 ListOfBinRels 是一個非空的二元關係列表 [R[1], ..., R[n]],且 BinRel1 是一個二元關係,則 BinRel2 是有序集合 (R[i], ..., R[n]) 與 BinRel1相對乘積

如果省略 BinRel1,則會改用 R[i] 的範圍的笛卡兒積範圍 R[1] × ... × 範圍 R[n] 的元素之間的相等關係(直觀上,沒有任何「遺失」)。

1> TR = sofs:relation([{1,a},{1,aa},{2,b}]),
R1 = sofs:relation([{1,u},{2,v},{3,c}]),
R2 = sofs:relative_product([TR, R1]),
sofs:to_external(R2).
[{1,{a,u}},{1,{aa,u}},{2,{b,v}}]

請注意,relative_product([R1], R2)relative_product(R1, R2) 不同;具有一個元素的列表不會識別為元素本身。

傳回二元關係 BinRel1BinRel2相對乘積

連結至此函數

restriction(BinRel1, Set)

檢視原始碼
-spec restriction(BinRel1, Set) -> BinRel2
                     when BinRel1 :: binary_relation(), BinRel2 :: binary_relation(), Set :: a_set().

傳回二元關係 BinRel1Set限制

1> R1 = sofs:relation([{1,a},{2,b},{3,c}]),
S = sofs:set([1,2,4]),
R2 = sofs:restriction(R1, S),
sofs:to_external(R2).
[{1,a},{2,b}]
連結至此函數

restriction(SetFun, Set1, Set2)

檢視原始碼
-spec restriction(SetFun, Set1, Set2) -> Set3
                     when SetFun :: set_fun(), Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

傳回 Set1 的子集合,其中包含將 SetFun 應用於元素後,結果會在 Set2 中的那些元素。

1> S1 = sofs:relation([{1,a},{2,b},{3,c}]),
S2 = sofs:set([b,c,d]),
S3 = sofs:restriction(2, S1, S2),
sofs:to_external(S3).
[{2,b},{3,c}]
-spec set(Terms) -> Set when Set :: a_set(), Terms :: [term()].

等同於 set(Terms, [atom])

-spec set(Terms, Type) -> Set when Set :: a_set(), Terms :: [term()], Type :: type().

建立一個無序集合。如果結果是無序集合,則 set(L, T) 等同於 from_term(L, T)

連結至此函數

specification(Fun, Set1)

檢視原始碼
-spec specification(Fun, Set1) -> Set2 when Fun :: spec_fun(), Set1 :: a_set(), Set2 :: a_set().

傳回一個集合,其中包含 Set1 中所有使 Fun 傳回 true 的元素。如果 Fun 是一個元組 {external, Fun2},則 Fun2 會應用於每個元素的外部集合,否則 Fun 會應用於每個元素。

1> R1 = sofs:relation([{a,1},{b,2}]),
R2 = sofs:relation([{x,1},{x,2},{y,3}]),
S1 = sofs:from_sets([R1,R2]),
S2 = sofs:specification(fun sofs:is_a_function/1, S1),
sofs:to_external(S2).
[[{a,1},{b,2}]]
連結至此函數

strict_relation(BinRel1)

檢視原始碼
-spec strict_relation(BinRel1) -> BinRel2
                         when BinRel1 :: binary_relation(), BinRel2 :: binary_relation().

傳回對應於二元關係 BinRel1嚴格關係

1> R1 = sofs:relation([{1,1},{1,2},{2,1},{2,2}]),
R2 = sofs:strict_relation(R1),
sofs:to_external(R2).
[{1,2},{2,1}]
連結至此函數

substitution(SetFun, Set1)

檢視原始碼
-spec substitution(SetFun, Set1) -> Set2 when SetFun :: set_fun(), Set1 :: a_set(), Set2 :: a_set().

傳回一個函數,其定義域為 Set1。定義域中元素的值是將 SetFun 應用於該元素的結果。

1> L = [{a,1},{b,2}].
[{a,1},{b,2}]
2> sofs:to_external(sofs:projection(1,sofs:relation(L))).
[a,b]
3> sofs:to_external(sofs:substitution(1,sofs:relation(L))).
[{{a,1},a},{{b,2},b}]
4> SetFun = {external, fun({A,_}=E) -> {E,A} end},
sofs:to_external(sofs:projection(SetFun,sofs:relation(L))).
[{{a,1},a},{{b,2},b}]

元素 {a,b,c} 之間的相等關係

1> I = sofs:substitution(fun(A) -> A end, sofs:set([a,b,c])),
sofs:to_external(I).
[{a,a},{b,b},{c,c}]

SetOfSets 為集合的集合,而 BinRel 為二元關係。下列函數會傳回將 SetOfSets 的每個元素 Set 對應到 SetBinRel 下的影像的函數

images(SetOfSets, BinRel) ->
   Fun = fun(Set) -> sofs:image(BinRel, Set) end,
   sofs:substitution(Fun, SetOfSets).

外部無序集合以排序列表的形式表示。因此,在關係 R 下建立集合的影像會遍歷 R 的所有元素(這會導致結果的排序,即影像)。在 image/2 中,BinRel 會為 SetOfSets 的每個元素遍歷一次,這可能會花費太長時間。如果假設 SetOfSets 的每個元素在 BinRel 下的影像都是非空的,則可以使用以下高效函數。

images2(SetOfSets, BinRel) ->
   CR = sofs:canonical_relation(SetOfSets),
   R = sofs:relative_product1(CR, BinRel),
   sofs:relation_to_family(R).
-spec symdiff(Set1, Set2) -> Set3 when Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

傳回 Set1Set2對稱差(或布林和)。

1> S1 = sofs:set([1,2,3]),
S2 = sofs:set([2,3,4]),
P = sofs:symdiff(S1, S2),
sofs:to_external(P).
[1,4]
連結至此函數

symmetric_partition(Set1, Set2)

檢視原始碼
-spec symmetric_partition(Set1, Set2) -> {Set3, Set4, Set5}
                             when
                                 Set1 :: a_set(),
                                 Set2 :: a_set(),
                                 Set3 :: a_set(),
                                 Set4 :: a_set(),
                                 Set5 :: a_set().

傳回一個由集合組成的三元組。

  • Set3 包含不屬於 Set2Set1 的元素。
  • Set4 包含屬於 Set2Set1 的元素。
  • Set5 包含不屬於 Set1Set2 的元素。
-spec to_external(AnySet) -> ExternalSet when ExternalSet :: external_set(), AnySet :: anyset().

傳回原子、有序或無序集合的外部集合

-spec to_sets(ASet) -> Sets
                 when
                     ASet :: a_set() | ordset(), Sets :: tuple_of(AnySet) | [AnySet], AnySet :: anyset().

將有序集合 ASet 的元素以集合的元組形式傳回,並將無序集合 ASet 的元素以不含重複項的排序集合列表形式傳回。

-spec type(AnySet) -> Type when AnySet :: anyset(), Type :: type().

傳回原子、有序或無序集合的類型

-spec union(SetOfSets) -> Set when Set :: a_set(), SetOfSets :: set_of_sets().

傳回集合的集合 SetOfSets聯集

-spec union(Set1, Set2) -> Set3 when Set1 :: a_set(), Set2 :: a_set(), Set3 :: a_set().

傳回 Set1Set2聯集

連結至此函數

union_of_family(Family)

檢視原始碼
-spec union_of_family(Family) -> Set when Family :: family(), Set :: a_set().

傳回 Family 的聯集。

1> F = sofs:family([{a,[0,2,4]},{b,[0,1,2]},{c,[2,3]}]),
S = sofs:union_of_family(F),
sofs:to_external(S).
[0,1,2,3,4]
連結至此函數

weak_relation(BinRel1)

檢視原始碼
-spec weak_relation(BinRel1) -> BinRel2 when BinRel1 :: binary_relation(), BinRel2 :: binary_relation().

傳回 弱關係 W 的子集 S,該弱關係對應於二元關係 BinRel1。令 F 為 BinRel1。子集 S 的定義如下:如果對於 F 中的某些 x 和 F 中的某些 y,x W y,則 x S y。

1> R1 = sofs:relation([{1,1},{1,2},{3,1}]),
R2 = sofs:weak_relation(R1),
sofs:to_external(R2).
[{1,1},{1,2},{2,2},{3,1},{3,3}]