fun buildList(n) = if n <= 0 then [0] else n::buildList(n-1); fun inList([],_) = false | inList(L, n:int) = if hd(L) = n then true else inList(tl(L), n); fun summe_und_uebertr(c, x, y, base) = let val system = buildList(base - 1); val sum = c + x + y in if inList(system, c) andalso inList(system, x) andalso inList(system, y) then SOME (sum div base, sum mod base) else NONE end; fun dual_summe_und_uebertr(c, x1, x2) = summe_und_uebertr(c, x1, x2, 2); dual_summe_und_uebertr(1,1,1); dual_summe_und_uebertr(1,0,1); dual_summe_und_uebertr(0,0,0); dual_summe_und_uebertr(1,1,4); dual_summe_und_uebertr(0,~65,1); dual_summe_und_uebertr(0,0,123); dual_summe_und_uebertr(7,1,1); fun dez_summe_und_uebertr(c, x1, x2) = summe_und_uebertr(c, x1, x2, 10); dez_summe_und_uebertr(0,7,8); dez_summe_und_uebertr(0,2,3); dez_summe_und_uebertr(1,23,3); dez_summe_und_uebertr(1,4,3); dez_summe_und_uebertr(1,9,9); dez_summe_und_uebertr(1,9,~9); fun hex_summe_und_uebertr(c, x1, x2) = summe_und_uebertr(c, x1, x2, 16); hex_summe_und_uebertr(0,7,8); hex_summe_und_uebertr(0,2,3); hex_summe_und_uebertr(1,23,3); hex_summe_und_uebertr(1,4,3); hex_summe_und_uebertr(1,9,9); hex_summe_und_uebertr(1,9,~9); fun fillList([], 0) = [0] | fillList(L, n) = if length(L) >= n then L else fillList(L@[0], n); fun summa(f, l1:int list, l2:int list, c:int, s) = if null(l1) then SOME(s) else let val t = f(c, hd(rev(l1)), hd(rev(l2))) in if isSome(t) then summa(f, rev(tl(rev(l1))), rev(tl(rev(l2))), hd(valOf(t)), s @ [hd(rev(valOf(t)))] ) else NONE end; fun summe(f, l1, l2) = let val mlen = Int.max(length l1, length l2); val m1 = fillList(l1, mlen); val m2 = fillList(l2, mlen); val r = summa(f, m1, m2, 0, []) in if r = SOME([]) then SOME([0]) else r end;