type Row { values: List count: Int } appendValue(item: Int, state: Row) (next: Row) { values = append(state.values, item) next = Row { values = values count = state.count + 1 } } preserved(state: Row) (next: Row) { added = append(state.values, 99) next = state next.count = length(added) } appendObserved(item: Int, state: Row) (next: Row) { values = append(state.values, item + length(state.values)) next = Row { values = values count = length(state.values) } } appendCounted(item: Int, state: Row) (next: Row) { values = append(state.values, item) next = Row { values = values count = length(values) } } type Pair { values: List first: Int second: Int } appendPair(item: Int, state: Pair) (next: Pair) { values = append(state.values, item + state.first) next = Pair { second = state.first values = values first = state.second + item } } appendFault(item: Int, state: Pair) (next: Pair) { values = append(state.values, item * state.first) next = Pair { second = state.second + 1 values = values first = state.first + 1 } } prefixFault() (answer: Pair) { answer = reduce(appendFault, [2], Pair { values = [1] first = 9223372036854775807 second = 9223372036854775807 }) } firstFieldFault() (answer: Pair) { answer = reduce(appendFault, [0], Pair { values = [1] first = 9223372036854775807 second = 9223372036854775807 }) } lastFieldFault() (answer: Pair) { answer = reduce(appendFault, [0], Pair { values = [1] first = 9223372036854775807 second = 0 }) } type Table { values: Map total: Int } readTable(item: Int, state: Table) (next: Table) { next = Table { values = state.values total = state.total + item + length(state.values) } } verify() (answer: Bool) { original = Row { values = [1] count = 1 } changed = reduce(appendValue, [2, 3, 4], original) answer = changed.values == [1, 2, 3, 4] and changed.count == 4 answer = answer and original.values == [1] and original.count == 1 answer = answer and reduce(appendValue, [], original) == original copy = preserved(original) answer = answer and copy.values == [1] and copy.count == 2 row = appendValue(5, original) first = append(row.values, row.count) second = append(row.values, 8) answer = answer and first == [1, 5, 2] and second == [1, 5, 8] row.values = [9] answer = answer and row.values == [9] and row.count == 2 observed = reduce(appendObserved, [2, 3], original) counted = reduce(appendCounted, [2, 3], original) answer = answer and observed.values == [1, 3, 5] and observed.count == 2 answer = answer and counted.values == [1, 2, 3] and counted.count == 3 bytes = reduce(appendValue, dever.bytes.fromText("AB"), original) answer = answer and bytes.values == [1, 65, 66] and bytes.count == 3 pair = Pair { values = [1] first = 10 second = 20 } swapped = reduce(appendPair, [2, 3], pair) answer = answer and swapped.values == [1, 12, 25] answer = answer and swapped.first == 13 and swapped.second == 22 answer = answer and pair.values == [1] and pair.first == 10 and pair.second == 20 answer = answer and reduce(appendPair, [], pair) == pair table = Table { values = {"key" = 1} total = 1 } counted_table = reduce(readTable, [2, 3], table) answer = answer and counted_table.total == 8 and counted_table.values == table.values answer = answer and table.total == 1 and table.values == {"key" = 1} answer = answer and reduce(readTable, [], table) == table }