授業での問題に対して一連の関数を書く必要がありました。私がそれらを書いた方法は、必要以上に複雑だったと思います。事前に定義されたものを使用せずに、すべての関数を自分で実装する必要がありました。これらの回答の簡単な「1行」バージョンがあるかどうか知りたいですか?
- セットはリストとして表すことができます。セットのメンバーは、リストに任意の順序で表示できますが、リストに要素が複数回出現することはありません。
(a) dif(A, B) を定義して、A と B の集合差、AB を計算します。
(b) 集合 A と集合 B のデカルト積を計算するために cartesian(A, B) を定義します。{ (a, b) | a∈A、b∈B}。
(c) 次の数学的帰納的証明を考えてみましょう: 集合 A に n 個の要素がある場合、A の冪集合には 2n 個の要素があります。証明に続いて、powerset(A) を定義して集合 A のべき集合 { B | を計算します。B⊆A}。
(d) 集合 A と自然数 k が与えられると、サイズ k の A のすべての部分集合の集合を返す関数を定義します。
(* Takes in an element and a list and compares to see if element is in list*)
fun helperMem(x,[]) = false
| helperMem(x,n::y) =
if x=n then true
else helperMem(x,y);
(* Takes in two lists and gives back a single list containing unique elements of each*)
fun helperUnion([],y) = y
| helperUnion(a::x,y) =
if helperMem(a,y) then helperUnion(x,y)
else a::helperUnion(x,y);
(* Takes in an element and a list. Attaches new element to list or list of lists*)
fun helperAttach(a,[]) = []
helperAttach(a,b::y) = helperUnion([a],b)::helperAttach(a,y);
(* Problem 1-a *)
fun myDifference([],y) = []
| myDifference(a::x,y) =
if helper(a,y) then myDifference(x,y)
else a::myDifference(x,y);
(* Problem 1-b *)
fun myCartesian(xs, ys) =
let fun first(x,[]) = []
| first(x, y::ys) = (x,y)::first(x,ys)
fun second([], ys) = []
| second(x::xs, ys) = first(x, ys) @ second(xs,ys)
in second(xs,ys)
end;
(* Problem 1-c *)
fun power([]) = [[]]
| power(a::y) = union(power(y),insert(a,power(y)));
問題 1-d にたどり着くことはありませんでした。これらを短くカットすることについて何か提案はありますか? 私が得られなかった別の問題がありましたが、今後のテストのために解決方法を知りたいです。
- (階段問題) n (>0) 段の階段を上りたいとします。一度に、一歩、二歩、または三歩進むことができます。しかし、たとえば、あと 1 歩ある場合、2 歩や 3 歩ではなく、1 歩しか進めません。階段を上るには何種類の方法がありますか? この問題を sml で解決します。(a) 再帰的に解きます。(b) 繰り返し解く。
これを解決する方法について何か助けはありますか?