Example #1
0
#!/usr/bin/env python2

from production import IF, AND, OR, NOT, THEN, DELETE, forward_chain

theft_rule = IF('you have (?x)', THEN('we have (?x)'), DELETE('you have (?x)'))

data = ('you have apple', 'you have orange', 'you have pear')

print forward_chain([theft_rule], data, verbose=False)
Example #2
0
#  and observing the results printed to your screen after executing lab1.py
# pprint(forward_chain([transitive_rule], abc_data))
# pprint(forward_chain([transitive_rule], poker_data))
# pprint(forward_chain([transitive_rule], minecraft_data))

#### Part 3: Family Relations #########################################

# Define your rules here. We've given you an example rule whose lead you can follow:
friend_rule = IF(AND("person (?x)", "person (?y)"),
                 THEN("friend (?x) (?y)", "friend (?y) (?x)"))
sibling_rule1 = IF(
    AND("parent (?x) (?y)", "parent (?x) (?z)", NOT("issame (?y) (?z)")),
    THEN("sibling (?y) (?z)"))
sibling_rule2 = IF("sibling (?x) (?y)", THEN("sibling (?y) (?x)"))
issame_rule = IF("person (?x)", THEN("issame (?x) (?x)"),
                 DELETE("person (?x)"))
child_rule = IF("parent (?x) (?y)", THEN("child (?y) (?x)"))
parent_rule = IF("child (?x) (?y)", THEN("parent (?y) (?x)"))
grandparent_rule = IF(AND("parent (?x) (?y)", "parent (?y) (?z)"),
                      THEN("grandparent (?x) (?z)"))
grandchild_rule = IF("grandparent (?x) (?y)", THEN("grandchild (?y) (?x)"))
cousin_rule1 = IF(
    AND("sibling (?x) (?y)", "parent (?x) (?z)", "parent (?y) (?w)"),
    THEN("cousin (?z) (?w)"))
cousin_rule2 = IF("cousin (?x) (?y)", THEN("cousin (?y) (?x)"))

#'person (?x)': x is a person
#'parent (?x) (?y)': x is a parent of y
#Every person in the data set will be explicitly defined as a person.
#
#Your task is to deduce, wherever you can, the following relations:
Example #3
0
from production import IF, AND, OR, NOT, THEN, DELETE, forward_chain

theft_rule = IF( 'you have (?x)',
                 THEN('i have (?x)'),
                 DELETE('you have (?x)'))

data = ('you have apple', 'you have orange', 'you have pear')

print forward_chain([theft_rule], data, verbose=True)
Example #4
0
transitive_rule = IF(AND('(?x) beats (?y)', '(?y) beats (?z)'),
                     THEN('(?x) beats (?z)'))

# You can test your rule by uncommenting these print statements:
#print forward_chain([transitive_rule], abc_data)
#print forward_chain([transitive_rule], poker_data)
#print forward_chain([transitive_rule], minecraft_data)

#### Part 3: Family Relations #########################################

# Define your rules here:

# Add your rules to this list:
family_rules = [
    IF(AND('person (?x)'), THEN('self (?x) (?x)'), DELETE('person (?x)')),
    IF(AND('parent (?x) (?y)'), THEN('child (?y) (?x)')),
    IF(AND('parent (?x) (?y)', 'parent (?x) (?z)', NOT('self (?y) (?z)')),
       THEN('sibling (?y) (?z)')),
    IF(AND('parent (?x) (?y)', 'parent (?z) (?x)'),
       THEN('grandparent (?z) (?y)', 'grandchild (?y) (?z)')),
    IF(AND('sibling (?x) (?y)', 'parent (?x) (?a)', 'parent (?y) (?b)'),
       THEN('cousin (?a) (?b)'))
]

# Uncomment this to test your data on the Simpsons family:
#print forward_chain(family_rules, simpsons_data, verbose=True
# These smaller datasets might be helpful for debugging:
#forward_chain(family_rules, sibling_test_data, verbose=True)
#forward_chain(family_rules, grandparent_test_data, verbose=True)
Example #5
0
def get_winning_hand_assertions(classified_hands_assertions):
    DIFFERENT_RANK_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "(?r1) beats (?r2)"), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    STRAIGHT_FLUSH_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) straight_flush",
                "(?v11) greater (?v12)"), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    FOUR_OF_A_KIND_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) four_of_a_kind",
                OR("(?v11) greater (?v12)",
                   AND("same value (?v11) (?v12)", "(?v51) greater (?v52)"))),
            THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    FULL_HOUSE_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) full_house",
                OR("(?v11) greater (?v12)",
                   AND("same value (?v11) (?v12)", "(?v41) greater (?v42)"))),
            THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]
    FLUSH_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) flush",
                OR(
                    "(?v11) greater (?v12)",
                    AND("same value (?v11) (?v12)", "(?v21) greater (?v22)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "(?v31) greater (?v32)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "same value (?v31) (?v32)", "(?v41) greater (?v42)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "same value (?v31) (?v32)", "same value (?v41) (?v42)",
                        "(?v51) greater (?v52)"))), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    STRAIGHT_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) straight",
                "(?v11) greater (?v12)"), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    THREE_OF_A_KIND_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) three_of_a_kind",
                OR(
                    "(?v11) greater (?v12)",
                    AND("same value (?v11) (?v12)", "(?v41) greater (?v42)"),
                    AND("same value (?v11) (?v12)", "same value (?v41) (?v42)",
                        "(?v51) greater (?v52)"))), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    TWO_PAIR_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) two_pair",
                OR(
                    "(?v11) greater (?v12)",
                    AND("same value (?v11) (?v12)", "(?v31) greater (?v32)"),
                    AND("same value (?v11) (?v12)", "same value (?v31) (?v32)",
                        "(?v51) greater (?v52)"))), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]
    ONE_PAIR_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) one_pair",
                OR(
                    "(?v11) greater (?v12)",
                    AND("same value (?v11) (?v12)", "(?v31) greater (?v32)"),
                    AND("same value (?v11) (?v12)", "same value (?v31) (?v32)",
                        "(?v41) greater (?v42)"),
                    AND("same value (?v11) (?v12)", "same value (?v31) (?v32)",
                        "same value (?v41) (?v42)", "(?v51) greater (?v52)"))),
            THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    HIGH_CARD_BEAT_RULE = [
        IF(
            AND(
                "hand rank : (?p1) : (?r1) : (?v11) (?s11), (?v21) (?s21), (?v31) (?s31), (?v41) (?s41), (?v51) (?s51)",
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)",
                "same rank (?r1) (?r2)", "same rank (?r1) high_card",
                OR(
                    "(?v11) greater (?v12)",
                    AND("same value (?v11) (?v12)", "(?v21) greater (?v22)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "(?v31) greater (?v32)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "same value (?v31) (?v32)", "(?v41) greater (?v42)"),
                    AND("same value (?v11) (?v12)", "same value (?v21) (?v22)",
                        "same value (?v31) (?v32)", "same value (?v41) (?v42)",
                        "(?v51) greater (?v52)"))), THEN(),
            DELETE(
                "hand rank : (?p2) : (?r2) : (?v12) (?s12), (?v22) (?s22), (?v32) (?s32), (?v42) (?s42), (?v52) (?s52)"
            ))
    ]

    best_players_rules = flatten([
        DIFFERENT_RANK_BEAT_RULE, STRAIGHT_FLUSH_BEAT_RULE,
        FOUR_OF_A_KIND_BEAT_RULE, FULL_HOUSE_BEAT_RULE, FLUSH_BEAT_RULE,
        STRAIGHT_BEAT_RULE, THREE_OF_A_KIND_BEAT_RULE, TWO_PAIR_BEAT_RULE,
        ONE_PAIR_BEAT_RULE, HIGH_CARD_BEAT_RULE
    ])

    top_hands_assertions = forward_chain(best_players_rules,
                                         classified_hands_assertions)

    BEST_HANDS_RULE = [
        IF(
            "hand rank : (?p) : (?r) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            THEN(
                "winner (?p) with (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    return forward_chain(BEST_HANDS_RULE, top_hands_assertions)
Example #6
0
def get_classified_hands_assertions(sorted_hands_assertions):
    HAND_RANK_STRAIGHT_FLUSH_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "(?v1) succeeds (?v2)", "(?v2) succeeds (?v3)",
                "(?v3) succeeds (?v4)", "(?v4) succeeds (?v5)",
                "same suit (?s1) (?s2)", "same suit (?s2) (?s3)",
                "same suit (?s3) (?s4)", "same suit (?s4) (?s5)"),
            THEN(
                "hand rank : (?p) : straight_flush : (?v1) (?s1), (?v2) (?s1), (?v3) (?s1), (?v4) (?s1), (?v5) (?s1)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
    ]

    HAND_RANK_FOUR_OF_A_KIND_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v2) (?v3)",
                "same value (?v3) (?v4)"),
            THEN(
                "hand rank : (?p) : four_of_a_kind : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v2) (?v3)", "same value (?v3) (?v4)",
                "same value (?v4) (?v5)"),
            THEN(
                "hand rank : (?p) : four_of_a_kind : (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5), (?v1) (?s1)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    HAND_RANK_FULL_HOUSE_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v2) (?v3)",
                "same value (?v4) (?v5)"),
            THEN(
                "hand rank : (?p) : full_house : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v3) (?v4)",
                "same value (?v4) (?v5)"),
            THEN(
                "hand rank : (?p) : full_house : (?v3) (?s3), (?v4) (?s4), (?v5) (?s5), (?v1) (?s1), (?v2) (?s2)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    HAND_RANK_FLUSH_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same suit (?s1) (?s2)", "same suit (?s2) (?s3)",
                "same suit (?s3) (?s4)", "same suit (?s4) (?s5)",
                NOT(
                    AND("(?v1) succeeds (?v2)", "(?v2) succeeds (?v3)",
                        "(?v3) succeeds (?v4)", "(?v4) succeeds (?v5)"))),
            THEN(
                "hand rank : (?p) : flush : (?v1) (?s1), (?v2) (?s1), (?v3) (?s1), (?v4) (?s1), (?v5) (?s1)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
    ]

    HAND_RANK_STRAIGHT_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "(?v1) succeeds (?v2)", "(?v2) succeeds (?v3)",
                "(?v3) succeeds (?v4)", "(?v4) succeeds (?v5)",
                NOT(
                    AND("same suit (?s1) (?s2)", "same suit (?s2) (?s3)",
                        "same suit (?s3) (?s4)", "same suit (?s4) (?s5)"))),
            THEN(
                "hand rank : (?p) : straight : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
    ]

    HAND_RANK_THREE_OF_A_KIND_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v2) (?v3)",
                NOT(
                    OR("same value (?v3) (?v4)", "same value (?v4) (?v5)",
                       "same value (?v5) (?v3)"))),
            THEN(
                "hand rank : (?p) : three_of_a_kind : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v2) (?v3)", "same value (?v3) (?v4)",
                NOT(
                    OR("same value (?v1) (?v4)", "same value (?v4) (?v5)",
                       "same value (?v5) (?v1)"))),
            THEN(
                "hand rank : (?p) : three_of_a_kind : (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v1) (?s1), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v3) (?v4)", "same value (?v4) (?v5)",
                NOT(
                    OR("same value (?v1) (?v2)", "same value (?v2) (?v3)",
                       "same value (?v3) (?v1)"))),
            THEN(
                "hand rank : (?p) : three_of_a_kind : (?v3) (?s3), (?v4) (?s4), (?v5) (?s5), (?v1) (?s1), (?v2) (?s2)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    HAND_RANK_TWO_PAIR_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v3) (?v4)",
                NOT(
                    OR("same value (?v1) (?v3)", "same value (?v3) (?v5)",
                       "same value (?v5) (?v1)"))),
            THEN(
                "hand rank : (?p) : two_pair : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)", "same value (?v4) (?v5)",
                NOT(
                    OR("same value (?v1) (?v3)", "same value (?v3) (?v5)",
                       "same value (?v5) (?v1)"))),
            THEN(
                "hand rank : (?p) : two_pair : (?v1) (?s1), (?v2) (?s2), (?v4) (?s4), (?v5) (?s5), (?v3) (?s3)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v2) (?v3)", "same value (?v4) (?v5)",
                NOT(
                    OR("same value (?v1) (?v3)", "same value (?v3) (?v5)",
                       "same value (?v5) (?v1)"))),
            THEN(
                "hand rank : (?p) : two_pair : (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5), (?v1) (?s1)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    HAND_RANK_ONE_PAIR_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v1) (?v2)",
                NOT(
                    OR("same value (?v1) (?v3)", "same value (?v1) (?v4)",
                       "same value (?v1) (?v5)", "same value (?v3) (?v4)",
                       "same value (?v3) (?v5)", "same value (?v4) (?v5)"))),
            THEN(
                "hand rank : (?p) : one_pair : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v2) (?v3)",
                NOT(
                    OR("same value (?v1) (?v3)", "same value (?v1) (?v4)",
                       "same value (?v1) (?v5)", "same value (?v3) (?v4)",
                       "same value (?v3) (?v5)", "same value (?v4) (?v5)"))),
            THEN(
                "hand rank : (?p) : one_pair : (?v2) (?s2), (?v3) (?s3), (?v1) (?s1), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v3) (?v4)",
                NOT(
                    OR("same value (?v1) (?v2)", "same value (?v1) (?v3)",
                       "same value (?v1) (?v5)", "same value (?v2) (?v3)",
                       "same value (?v2) (?v5)", "same value (?v3) (?v5)"))),
            THEN(
                "hand rank : (?p) : one_pair : (?v3) (?s3), (?v4) (?s4), (?v1) (?s1), (?v2) (?s2), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                "same value (?v4) (?v5)",
                NOT(
                    OR("same value (?v1) (?v2)", "same value (?v1) (?v3)",
                       "same value (?v1) (?v4)", "same value (?v2) (?v3)",
                       "same value (?v2) (?v4)", "same value (?v3) (?v4)"))),
            THEN(
                "hand rank : (?p) : one_pair : (?v4) (?s4), (?v5) (?s5), (?v1) (?s1), (?v2) (?s2), (?v3) (?s3)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ))
    ]

    HAND_RANK_HIGH_CARD_RULE = [
        IF(
            AND(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
                NOT(
                    OR("same value (?v1) (?v2)", "same value (?v1) (?v3)",
                       "same value (?v1) (?v4)", "same value (?v1) (?v5)",
                       "same value (?v2) (?v3)", "same value (?v2) (?v4)",
                       "same value (?v2) (?v5)", "same value (?v3) (?v4)",
                       "same value (?v3) (?v5)", "same value (?v4) (?v5)")),
                NOT(
                    AND("(?v1) succeeds (?v2)", "(?v2) succeeds (?v3)",
                        "(?v3) succeeds (?v4)", "(?v4) succeeds (?v5)")),
                NOT(
                    AND("same suit (?s1) (?s2)", "same suit (?s2) (?s3)",
                        "same suit (?s3) (?s4)", "same suit (?s4) (?s5)"))),
            THEN(
                "hand rank : (?p) : high_card : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            ),
            DELETE(
                "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
            )),
    ]

    hand_rank_classifier_rules = flatten([
        HAND_RANK_STRAIGHT_FLUSH_RULE, HAND_RANK_FOUR_OF_A_KIND_RULE,
        HAND_RANK_FULL_HOUSE_RULE, HAND_RANK_FLUSH_RULE,
        HAND_RANK_STRAIGHT_RULE, HAND_RANK_THREE_OF_A_KIND_RULE,
        HAND_RANK_TWO_PAIR_RULE, HAND_RANK_ONE_PAIR_RULE,
        HAND_RANK_HIGH_CARD_RULE
    ])

    hand_rank_classifier_assertions = forward_chain(hand_rank_classifier_rules,
                                                    sorted_hands_assertions)

    return purge("(?v1) succeeds (?v2)", hand_rank_classifier_assertions)
Example #7
0
def purge(pattern, assertions):
    purge_rule = IF(AND(pattern), THEN(), DELETE(pattern))
    return forward_chain([purge_rule], assertions)
Example #8
0
def get_sorted_hands_assertions(hands):
    if isinstance(hands, str):
        hands = [hands]
    elif isinstance(hands, tuple):
        hands = list(hands)
    SAME_HAND_RULE = IF(
        OR("(?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
           ),
        THEN(
            "same hand (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ))

    hands_assertions = hands + BASE_ASSERTIONS

    hands_assertions = forward_chain([SAME_HAND_RULE], hands_assertions)

    SORT_HAND_RULE_1 = IF(
        AND(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            OR("(?v2) greater (?v1)",
               AND("same value (?v2) (?v1)", "(?s2) greater (?s1)"))),
        THEN(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v2) (?s2), (?v1) (?s1), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ),
        DELETE(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ))

    SORT_HAND_RULE_2 = IF(
        AND(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            OR("(?v3) greater (?v2)",
               AND("same value (?v3) (?v2)", "(?s3) greater (?s2)"))),
        THEN(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v3) (?s3), (?v2) (?s2), (?v4) (?s4), (?v5) (?s5)"
        ),
        DELETE(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ))

    SORT_HAND_RULE_3 = IF(
        AND(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            OR("(?v4) greater (?v3)",
               AND("same value (?v4) (?v3)", "(?s4) greater (?s3)"))),
        THEN(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v4) (?s4), (?v3) (?s3), (?v5) (?s5)"
        ),
        DELETE(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ))

    SORT_HAND_RULE_4 = IF(
        AND(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            OR("(?v5) greater (?v4)",
               AND("same value (?v5) (?v4)", "(?s5) greater (?s4)"))),
        THEN(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v5) (?s5), (?v4) (?s4)"
        ),
        DELETE(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ))

    SORTED_HAND_RULE = IF(
        AND(
            "(?p) : (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5)",
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            OR("(?v1) greater (?v2)",
               AND("same value (?v1) (?v2)", "(?s1) greater (?s2)")),
            OR("(?v2) greater (?v3)",
               AND("same value (?v2) (?v3)", "(?s2) greater (?s3)")),
            OR("(?v3) greater (?v4)",
               AND("same value (?v3) (?v4)", "(?s3) greater (?s4)")),
            OR("(?v4) greater (?v5)",
               AND("same value (?v4) (?v5)", "(?s4) greater (?s5)"))),
        THEN(
            "sorted (?p) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)"
        ),
        DELETE(
            "same hand (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5) : (?v1) (?s1), (?v2) (?s2), (?v3) (?s3), (?v4) (?s4), (?v5) (?s5)",
            "(?p) : (?pv1) (?ps1), (?pv2) (?ps2), (?pv3) (?ps3), (?pv4) (?ps4), (?pv5) (?ps5)"
        ))

    SORT_HAND_RULES = [
        SORT_HAND_RULE_1, SORT_HAND_RULE_2, SORT_HAND_RULE_3, SORT_HAND_RULE_4,
        SORTED_HAND_RULE
    ]

    hands_assertions = forward_chain(SORT_HAND_RULES, hands_assertions)
    return hands_assertions