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
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
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
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'
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)
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'),
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)
#!/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'),
def test_condition_contain(): c0 = Has('$a', '$b', '$c') assert c0.contain('$a') assert not c0.contain('$d')
def test_condition_vars(): c0 = Has('$x', 'is', '$y') assert len(c0.vars) == 2
def test_ncc(): c0 = Has('$a', '$b', '$c') c1 = Ncc(Has('$x', 'color', 'red')) c2 = Ncc(c0, c1) assert c2.number_of_conditions == 2
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)
#!/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))