2016-02-12 3 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.