def is_valid(grid): size = len(grid) rows = grid cols = zip(*rows) diags = [ [grid[i][i] for i in xrange(size)], [grid[i][size - i - 1] for i in xrange(size)], ] return all(all_different(s) for s in rows + cols + diags) @combinator def un_all_different(xs): return app(xs, lib.true, lambda h, t: lib.bool_and( lib.list_all(lambda x: lib.bool_not(lib.list_num_eq(h, x))), all_different(t))) @combinator def un_is_valid(grid): TODO() py_all_different = program(('list', 'num'), 'bool')(un_all_different) py_is_valid = program(('list', ('list', 'num')), 'bool')(un_is_valid) if __name__ == '__main__': parsable()
from pomagma.reducer import lib from pomagma.reducer.engines import engine from pomagma.reducer.programs import program from pomagma.reducer.programs import using_engine from pomagma.reducer.sugar import app from pomagma.util.testing import for_each import pytest bool_not = program('bool', 'bool')(lib.bool_not) succ = program('num', 'num')(lib.succ) num_pred = program('num', 'num')(lib.num_pred) @program('num', 'num') def partial_pred(x): return app(x, lib.undefined, lambda px: px) num_add = program('num', 'num', 'num')(lib.num_add) num_lt = program('num', 'num', 'bool')(lib.num_lt) @for_each([ (bool_not, (True,), False), (bool_not, (False,), True), (bool_not, (0,), TypeError), (bool_not, ([],), TypeError), (succ, (0,), 1), (succ, (1,), 2), (succ, (2,), 3),