1

授業での問題に対して一連の関数を書く必要がありました。私がそれらを書いた方法は、必要以上に複雑だったと思います。事前に定義されたものを使用せずに、すべての関数を自分で実装する必要がありました。これらの回答の簡単な「1行」バージョンがあるかどうか知りたいですか?

  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 にたどり着くことはありませんでした。これらを短くカットすることについて何か提案はありますか? 私が得られなかった別の問題がありましたが、今後のテストのために解決方法を知りたいです。

  1. (階段問題) n (>0) 段の階段を上りたいとします。一度に、一歩、二歩、または三歩進むことができます。しかし、たとえば、あと 1 歩ある場合、2 歩や 3 歩ではなく、1 歩しか進めません。階段を上るには何種類の方法がありますか? この問題を sml で解決します。(a) 再帰的に解きます。(b) 繰り返し解く。

これを解決する方法について何か助けはありますか?

4

1 に答える 1