Beispiel #1
0
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()
Beispiel #2
0
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),