2016-02-12 56 views
0

我想實現另一組的子集。但是,我無法使用以下示例{{{},1}}和{{1,{}}}進行工作我嘗試了所有我能夠做到的事情。我的主要目標是設定平等,在這種情況下返回true。首先,我想讓我的子集工作,然後實現設置的等式。設置另一組子集SML

datatype expression = SET of expression list | TUPLE of expression list | INT of int  
fun member(a,SET y) = List.exists (fn x => x=a) y; 

fun member1 (n,nil) = false 
| member1 (n, SET h::r) = (n=h) orelse member1 (n,r); 

fun isIn value list = List.exists (fn x=>value=x) list; 

fun isSubset' ([],s') = true 
    | isSubset' (e::s,s') = isIn e s' andalso isSubset' (s,s'); 

fun isSubset(SET s,SET s') = isSubset'(s,s'); 


fun subsetEQ [] S' = true 
    | subsetEQ (x::xs) S' = isIn x S' andalso subsetEQ xs S'; 
     fun setEq (SET S,SET S') = (subsetEQ S S') andalso (subsetEQ S' S) ; 



val x0 = INT 8; 
val x1 = SET [SET[SET[],INT 1]]; 
val x2 = SET [SET[INT 1,SET[]]]; 
val x3 = setEq (x1,x2); 

回答

2

你的問題在於,

fun isIn value list = List.exists (fn x=>value=x) list; 

您正在使用常規的相等性,但對於嵌套集,您需要您試圖定義的集合相等的概念。

你真正需要的是三個相互遞歸的函數,一個用於成員,一個用於子集,另一個用於相等。此外,爲什麼不提供所有模式的合理定義,而不是有大量惱人的消息Warning: match nonexhaustive?你的代碼下面的修改是那種你可以做的事情(注意的三個相互遞歸函數的關鍵字and,而不是fun第二和第三):

datatype nested = SET of nested list | INT of int 

fun member (_, INT i) = false 
| member (SET x, SET y) = List.exists (fn z => equals(SET x, z)) y 
| member (INT i, SET y) = List.exists (fn x => x = INT i) y 

and equals (INT i, INT j) = i = j 
| equals (INT i, SET y) = false 
| equals (SET x, INT j) = false 
| equals (SET x, SET y) = subset (SET x, SET y) andalso subset(SET y, SET x) 

and subset (_, INT i) = false 
| subset (INT i, _) = false 
| subset (SET [], SET y) = true 
| subset (SET (x::xs), SET y) = member (x, SET y) andalso subset(SET xs, SET y); 

val x0 = INT 8; 
val x1 = SET [SET[SET[],INT 1]]; 
val x2 = SET [SET[INT 1,SET[]]]; 
val x3 = equals (x1,x2); 

上面沒有警告編譯和與x3 = true