Пример #1
0
    def test_dup(self):
        # setup
        net = Network()
        c0 = Has('$x', 'self', '$y')
        c1 = Has('$x', 'color', 'red')
        c2 = Has('$y', 'color', 'red')
        net.add_production(Rule(c0, c1, c2))

        wmes = [
            WME('B1', 'self', 'B1'),
            WME('B1', 'color', 'red'),
        ]
        for wme in wmes:
            net.add_wme(wme)
        # end

        am = net.build_or_share_alpha_memory(c2)
        join_on_value_y = am.children[1]
        match_for_all = join_on_value_y.children[0]

        assert len(match_for_all.memory) == 1
Пример #2
0
def test_ncc():
    net = Network()
    c0 = Has('$x', 'on', '$y')
    c1 = Has('$y', 'left-of', '$z')
    c2 = Has('$z', 'color', 'red')
    c3 = Has('$z', 'on', '$w')

    p0 = net.add_production(Rule(c0, c1, Ncc(c2, c3)))
    wmes = [
        WME('B1', 'on', 'B2'),
        WME('B1', 'on', 'B3'),
        WME('B1', 'color', 'red'),
        WME('B2', 'on', 'table'),
        WME('B2', 'left-of', 'B3'),
        WME('B2', 'color', 'blue'),
        WME('B3', 'left-of', 'B4'),
        WME('B3', 'on', 'table'),
    ]
    for wme in wmes:
        net.add_wme(wme)
    assert len(p0.items) == 2
    net.add_wme(WME('B3', 'color', 'red'))
    assert len(p0.items) == 1
Пример #3
0
def test_multi_productions():
    net = Network()
    c0 = Has('$x', 'on', '$y')
    c1 = Has('$y', 'left-of', '$z')
    c2 = Has('$z', 'color', 'red')
    c3 = Has('$z', 'on', 'table')
    c4 = Has('$z', 'left-of', 'B4')

    p0 = net.add_production(Rule(c0, c1, c2))
    p1 = net.add_production(Rule(c0, c1, c3, c4))

    wmes = [
        WME('B1', 'on', 'B2'),
        WME('B1', 'on', 'B3'),
        WME('B1', 'color', 'red'),
        WME('B2', 'on', 'table'),
        WME('B2', 'left-of', 'B3'),
        WME('B2', 'color', 'blue'),
        WME('B3', 'left-of', 'B4'),
        WME('B3', 'on', 'table'),
        WME('B3', 'color', 'red'),
    ]
    for wme in wmes:
        net.add_wme(wme)

    # add product on the fly
    p2 = net.add_production(Rule(c0, c1, c3, c2))

    assert len(p0.items) == 1
    assert len(p1.items) == 1
    assert len(p2.items) == 1
    assert p0.items[0].wmes == [wmes[0], wmes[4], wmes[8]]
    assert p1.items[0].wmes == [wmes[0], wmes[4], wmes[7], wmes[6]]
    assert p2.items[0].wmes == [wmes[0], wmes[4], wmes[7], wmes[8]]

    net.remove_production(p2)
    assert len(p2.items) == 0
Пример #4
0
def test_black_white():
    net = Network()
    c1 = Has('$item', 'cat', '$cid')
    c2 = Has('$item', 'shop', '$sid')
    white = Ncc(
        Has('$item', 'cat', '100'),
        Neg('$item', 'cat', '101'),
        Neg('$item', 'cat', '102'),
    )
    n1 = Neg('$item', 'shop', '1')
    n2 = Neg('$item', 'shop', '2')
    n3 = Neg('$item', 'shop', '3')
    p0 = net.add_production(Rule(c1, c2, white, n1, n2, n3))
    wmes = [
        WME('item:1', 'cat', '101'),
        WME('item:1', 'shop', '4'),
        WME('item:2', 'cat', '100'),
        WME('item:2', 'shop', '1'),
    ]
    for wme in wmes:
        net.add_wme(wme)

    assert len(p0.items) == 1
    assert p0.items[0].get_binding('$item') == 'item:1'
Пример #5
0
    def test__case_0(self):
        for i, (rule, wmes, exp) in enumerate([
            (Rule(Has('x', 'id', '1'), Has('x', 'kind',
                                           '8')), [WME('x', 'id', '1')], 0),
            (Rule(Has('x', 'id', '1'), Has('x', 'kind',
                                           '8')), [WME('x', 'kind', '8')], 0),
            (Rule(Has('x', 'id', '1'),
                  Has('x', 'kind',
                      '8')), [WME('x', 'id', '1'),
                              WME('x', 'kind', '8')], 1),
        ]):
            with self.subTest(i=i, rule=rule, wmes=wmes, exp=exp):
                network = Network()
                production = network.add_production(rule)
                for wme in wmes:
                    network.add_wme(wme)
                result = len(production.memory)

                assert_that(result, 'case 0').is_equal_to(exp)
Пример #6
0
print("\n\x1b[32m——`—,—{\x1b[31;1m@\x1b[0m\n")  # Genifer logo ——`—,—{@

net = Network()
p = []  # list of p-Nodes

# **** General strategy ****
# - if can win, play it
# - about to lose, play it
# - if center not occupied, play it
# - if able to 'double-fork', play it
# - play randomly

# row 0 win:
q = net.add_production(
    Rule(
        Has('□', '$x'),
        Has('X', '$y'),
        Has('X', '$z'),
        Has('!=', '$y', '$z'),
        Has('π0', '$x', 0),
        Has('π0', '$y', 0),
        Has('π0', '$z', 0),
    ))
q.postcondition = Has("row_0_win", '$x')
q.truth = 1.0
p.append(q)

# row 1 win:
q = net.add_production(
    Rule(
        Has('□', '$x'),
Пример #7
0
import sys
import os

from rete.common import Has, Rule, WME, Neg, Ncc, Token
from rete.network import Network

print("\n\x1b[32m——`—,—{\x1b[31;1m@\x1b[0m\n")  # Genifer logo ——`—,—{@

net = Network()

# Can win a vertical column:
# X($y, $x) ^ X($z, $x) ^ □($w, $x) ^ ($y != $z) => playX($w, $x)
p0 = net.add_production(
    Rule(
        Has('X', '$y', '$x'),
        Has('X', '$z', '$x'),
        Has('□', '$w', '$x'),
        Has('!=', '$y', '$z'),
    ))
p0.postcondition = Has("oldX", '$w', '$x')

# Can win a horizontal row:
# X($x, $y) ^ X($x, $z) ^ □($x, $w) ^ ($y != $z) => playX($x, $w)

# Can win a diagonal:
# X($x, $x) ^ X($y, $y) ^ □($z, $z) ^ ($x != $y) ^ ($y != $z) ^ ($z != $x) => playX($z, $z)

# Can win a backward diagonal: (0,2) (1,1) (2,0)
# X($x, $z) ^ X($y, $y) ^ □($z, $x) ^ ($x != $y) ^ ($y != $z) ^ ($z != $x) => playX($z, $z)
Пример #8
0
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import os

from rete.common import Has, Rule, WME, Neg, Ncc
from rete.network import Network

net = Network()

c1 = Has('male', '$a')
c2 = Has('love', '$a', '$b')
c3 = Has('female', '$b')

# net.add_production(Rule(Ncc(c1, Ncc(c2, c3))))
# net.add_production(Rule(Ncc(c2, Ncc(c3))))
# net.add_production(Rule(c1, Ncc(c2)))
# net.add_production(Rule(c1, Ncc(c2, c3)))
# net.add_production(Rule(c2, c3))
p0 = net.add_production(Rule(c3, Ncc(c2, c1)))

wmes = [
    WME('female', 'Mary'),
    WME('female', 'Ann'),
    WME('love', 'John', 'Pete'),  # 基
    WME('love', 'John', 'John'),  # 自恋
    WME('love', 'Pete', 'Mary'),  # 所谓正常
    WME('love', 'Pete', 'John'),  # 互基
    WME('love', 'Mary', 'Ann'),  # Lesbian
    WME('male', 'John'),
    WME('male', 'Pete'),
Пример #9
0
def test_condition_contain():
    c0 = Has('$a', '$b', '$c')
    assert c0.contain('$a')
    assert not c0.contain('$d')
Пример #10
0
def test_condition_vars():
    c0 = Has('$x', 'is', '$y')
    assert len(c0.vars) == 2
Пример #11
0
def test_ncc():
    c0 = Has('$a', '$b', '$c')
    c1 = Ncc(Has('$x', 'color', 'red'))
    c2 = Ncc(c0, c1)
    assert c2.number_of_conditions == 2
Пример #12
0
def test_condition_test():
    c0 = Has('$x', 'color', 'red')
    w0 = WME('B1', 'color', 'red')
    w1 = WME('B1', 'color', 'blue')
    assert c0.test(w0)
    assert not c0.test(w1)
Пример #13
0
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import os

from rete.common import Has, Rule, WME, Neg, Ncc, Token
from rete.network import Network

rete_net = Network()

c01 = Has('O', '$x', '$x')
c02 = Has('□', '$y', '$z')
c03 = Has('>', '$y', '$z')
p0 = rete_net.add_production(Rule(c01, c02, c03))

wmes = [
    WME('X', '0', '2'),
    WME('X', '1', '1'),
    WME('X', '2', '1'),
    WME('O', '0', '0'),
    WME('O', '1', '0'),
    WME('O', '1', '2'),
    WME('O', '2', '2'),
    WME('□', '0', '1'),
    WME('□', '2', '0'),
]
for wme in wmes:
    rete_net.add_wme(wme)

print("# of results = ", len(p0.items))