예제 #1
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def test_app_equal(lhs, rhs):
    truth_value = try_decide_equal(lhs, rhs)
    assert truth_value in (True, False, None)
    if truth_value is True:
        expected = true
    elif truth_value is False:
        expected = false
    else:
        expected = APP(APP(QEQUAL, QUOTE(lhs)), QUOTE(rhs))
    assert app(app(QEQUAL, QUOTE(lhs)), QUOTE(rhs)) is expected
예제 #2
0
파일: systems.py 프로젝트: fritzo/pomagma
def unfold(system, body):
    """Unfold the head variables in body via definitions in system.

    Note that due to JOIN terms, there may be multiple head variables.
    """
    assert isinstance(system, System)
    assert isinstance(body, Term)
    if is_atom(body) or is_ivar(body):
        return body
    if is_nvar(body):
        return system[body[1]]

    # Get a linear normal form.
    if is_app(body):
        body = bohm.app(unfold(system, body[1]), body[2])  # Only unfold head.
    elif is_abs(body):
        body = bohm.abstract(unfold(system, body[1]))
    elif is_join(body):
        parts = sorted(bohm.iter_join(body), key=bohm.priority)
        for i, part in enumerate(parts):
            if is_unfoldable(part):
                parts[i] = unfold(system, part)
                break
        body = bohm.join_set(set(parts))
    else:
        raise ValueError(body)

    # Reduce.
    return bohm.reduce(body, budget=1234567890)
예제 #3
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def some(x):
    return app(K, app(CI, x))
예제 #4
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def test_constants():
    assert app(I, x) is x
    assert app(app(K, x), y) is x
    assert app(app(app(B, x), y), z) is APP(x, APP(y, z))
    assert app(app(app(C, x), y), z) is APP(APP(x, z), y)
    assert app(app(app(S, x), y), z) is APP(APP(x, z), APP(y, z))
    assert KI is app(K, I)
    assert CI is app(C, I)
    assert CB is app(C, B)
예제 #5
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def test_app_abstract(term):
    hypothesis.assume(i0 not in quoted_vars(term))
    assert app(bohm.increment_rank(bohm.abstract(term)), i0) is term
예제 #6
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def test_abstract_eta(term):
    assert bohm.abstract(app(bohm.increment_rank(term), i0)) is term
예제 #7
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
def test_app(fun, arg, expected):
    with xfail_if_not_implemented():
        assert pretty(app(fun, arg)) == pretty(expected)
예제 #8
0
파일: bohm_test.py 프로젝트: fritzo/pomagma
    (APP(QEQUAL, BOT), TOP, TOP),
    (APP(QEQUAL, BOT), BOT, BOT),
    (APP(QEQUAL, BOT), QUOTE(i1), BOT),
    (APP(QEQUAL, BOT), i1, APP(APP(QEQUAL, BOT), i1)),
    (APP(QEQUAL, QUOTE(i0)), TOP, TOP),
    (APP(QEQUAL, QUOTE(i0)), BOT, BOT),
    (APP(QEQUAL, QUOTE(i0)), QUOTE(i1), false),
    (APP(QEQUAL, QUOTE(i0)), QUOTE(i0), true),
    (APP(QEQUAL, QUOTE(i0)), i1, APP(APP(QEQUAL, QUOTE(i0)), i1)),
    (APP(QEQUAL, i0), TOP, TOP),
    (APP(QEQUAL, i0), BOT, APP(APP(QEQUAL, i0), BOT)),
    (APP(QEQUAL, i0), QUOTE(i1), APP(APP(QEQUAL, i0), QUOTE(i1))),
    (APP(QEQUAL, i0), i1, APP(APP(QEQUAL, i0), i1)),
    (C, B, ABS(ABS(ABS(APP(i1, APP(i2, i0)))))),
    (S, I, ABS(ABS(APP(i0, APP(i1, i0))))),
    (app(S, I), I, ABS(APP(i0, i0))),
]


@for_each(APP_EXAMPLES)
def test_app(fun, arg, expected):
    with xfail_if_not_implemented():
        assert pretty(app(fun, arg)) == pretty(expected)


ABSTRACT_EXAMPLES = [
    (TOP, TOP),
    (BOT, BOT),
    (x, ABS(x)),
    (i0, ABS(i0)),
    (i1, ABS(i1)),
예제 #9
0
def test_abstract_eta(code):
    hypothesis.assume(is_const(code))
    assert abstract(app(code, IVAR(0))) is decrement_rank(code)
예제 #10
0
def test_app(fun, arg, expected):
    with xfail_if_not_implemented():
        assert app(fun, arg) is expected