Ejemplo n.º 1
0
    def test_new_context_replace_fact(self):
        predicate_shot = Predicate(content="$shooter shot $victim")
        predicate_no_gun = Predicate(content="$suspect had a gun", truth=False)
        predicate_told = Predicate(content="$speaker told $hearer $statement")
        shot = Fact(predicate=predicate_shot,
                    terms=[Entity(name="Alice"),
                           Entity(name="Bob")])
        told = Fact(
            predicate=predicate_told,
            terms=[Entity(name="Henry"),
                   Entity(name="Jenna"), shot],
        )
        no_gun = Fact(predicate=predicate_no_gun, terms=Entity(name="Dan"))

        changes = ContextRegister.from_lists(
            [
                Entity(name="Alice"),
                Entity(name="Henry"),
                Entity(name="Jenna"), shot
            ],
            [
                Entity(name="Dan"),
                Entity(name="Leslie"),
                Entity(name="Mike"), no_gun
            ],
        )
        result = told.new_context(changes)
        assert (
            "told <Mike> the fact it was false that <Dan> had a gun".lower()
            in result.short_string.lower())
Ejemplo n.º 2
0
    def nest_predicate_fields(cls, values):
        """Move fields passed to the Fact model that really belong to the Predicate model."""
        type_str = values.pop("type", "")
        if type_str and type_str.lower() != "fact":
            raise ValidationError(f"type {type_str} was passed to Fact model")

        if isinstance(values.get("predicate"), str):
            values["predicate"] = Predicate(content=values["predicate"])
            if "truth" in values:
                values["predicate"].truth = values.pop("truth")

        for field_name in ["content", "truth", "sign", "expression"]:
            if field_name in values:
                values["predicate"] = values.get("predicate", {})
                values["predicate"][field_name] = values.pop(field_name)
        if isinstance(values.get("predicate"),
                      dict) and values["predicate"].get("content"):
            for sign in {
                    **QuantityRange.opposite_comparisons,
                    **QuantityRange.normalized_comparisons,
            }:
                if sign in values["predicate"]["content"]:
                    content, quantity_text = values["predicate"][
                        "content"].split(sign)
                    values["predicate"]["content"] = content.strip()
                    values["predicate"]["expression"] = quantity_text.strip()
                    values["predicate"]["sign"] = sign
                    break
        return values
Ejemplo n.º 3
0
 def test_term_placeholders_do_not_change_result(self):
     left = Predicate(
         content="$organizer1 and $organizer2 planned for $player1 to play $game with $player2."
     )
     right = Predicate(
         content="$promoter1 and $promoter2 planned for $player1 to play $chess with $player2."
     )
     assert left.means(right)
Ejemplo n.º 4
0
 def test_term_positions_change_result(self):
     left = Predicate(
         content="$organizer1 and $organizer2 planned for $player1 to play $game with $player2."
     )
     right = Predicate(
         content="$organizer1 and $organizer2 planned for $organizer1 to play $game with $organizer2."
     )
     assert not left.means(right)
Ejemplo n.º 5
0
 def test_term_positions_with_repetition(self):
     predicate = Predicate(
         content="$organizer1 and $organizer2 planned for $organizer1 to play $game with $organizer2."
     )
     assert predicate.term_positions() == {
         "organizer1": {0, 1},
         "organizer2": {0, 1},
         "game": {2},
     }
Ejemplo n.º 6
0
 def test_equality_factor_from_equal_predicate(self):
     predicate = Predicate(content="$speaker greeted $listener")
     equal_predicate = Predicate(content="$speaker greeted $listener")
     fact = Fact(predicate=predicate,
                 terms=[Entity(name="Al"),
                        Entity(name="Meg")])
     fact_b = Fact(predicate=equal_predicate,
                   terms=[Entity(name="Al"),
                          Entity(name="Meg")])
     assert fact.means(fact_b)
Ejemplo n.º 7
0
 def test_term_permutations(self):
     predicate = Predicate(
         content="$organizer1 and $organizer2 planned for $player1 to play $game with $player2."
     )
     assert predicate.term_index_permutations() == [
         (0, 1, 2, 3, 4),
         (0, 1, 4, 3, 2),
         (1, 0, 2, 3, 4),
         (1, 0, 4, 3, 2),
     ]
Ejemplo n.º 8
0
 def test_add_unrelated_factors(self):
     murder = Fact(
         predicate=Predicate(content="$person committed a murder"),
         terms=Entity(name="Al"),
     )
     crime = Fact(
         predicate=Predicate(content="$person committed a crime"),
         terms=Entity(name="Al"),
     )
     assert murder + crime is None
Ejemplo n.º 9
0
 def test_same_predicate_true_vs_false(self):
     fact = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
     )
     fiction = Fact(
         predicate=Predicate(content="$person was a person", truth=False),
         terms=Entity(name="Alice"),
     )
     assert fact.contradicts(fiction)
     assert fact.truth != fiction.truth
Ejemplo n.º 10
0
 def test_factor_different_predicate_truth_unequal(self):
     predicate = Predicate(content="$shooter shot $victim")
     false_predicate = Predicate(content="$shooter shot $victim",
                                 truth=False)
     fact = Fact(predicate=predicate,
                 terms=[Entity(name="Al"),
                        Entity(name="Meg")])
     fact_b = Fact(predicate=false_predicate,
                   terms=[Entity(name="Al"),
                          Entity(name="Meg")])
     assert not fact.means(fact_b)
Ejemplo n.º 11
0
 def test_factor_no_contradiction_no_truth_value(self):
     fact = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
     )
     fact_no_truth = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
     )
     assert not fact.contradicts(fact_no_truth)
     assert not fact_no_truth.contradicts(fact)
Ejemplo n.º 12
0
 def test_statement_implies_no_truth_value(self):
     fact = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
     )
     whether = Fact(
         predicate=Predicate(content="$person was a person", truth=None),
         terms=Entity(name="Alice"),
     )
     assert fact >= whether
     assert not whether > fact
Ejemplo n.º 13
0
 def test_specific_statement_implies_generic(self):
     concrete = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
     )
     generic = Fact(
         predicate=Predicate(content="$person was a person"),
         terms=Entity(name="Alice"),
         generic=True,
     )
     assert concrete > generic
     assert not generic > concrete
Ejemplo n.º 14
0
    def test_specific_implies_generic_form_of_another_fact(self):
        concrete = Fact(
            predicate=Predicate(content="$person was a person"),
            terms=Entity(name="Alice"),
        )
        generic_merperson = Fact(
            predicate=Predicate(content="$person was a merperson"),
            terms=Entity(name="Alice"),
            generic=True,
        )

        assert concrete > generic_merperson
Ejemplo n.º 15
0
    def test_specific_implies_generic_explain(self):
        concrete = Fact(
            predicate=Predicate(content="$person was a person"),
            terms=Entity(name="Alice"),
        )
        generic = Fact(
            predicate=Predicate(content="$person was a person"),
            terms=Entity(name="Alice"),
            generic=True,
        )

        answer = concrete.explain_implication(generic)
        assert (str(concrete), generic) in answer.context.items()
Ejemplo n.º 16
0
 def test_get_factor_from_recursive_search(self):
     predicate_shot = Predicate(content="$shooter shot $victim")
     predicate_told = Predicate(content="$speaker told $hearer $statement")
     shot = Fact(predicate=predicate_shot,
                 terms=[Entity(name="Alice"),
                        Entity(name="Bob")])
     told = Fact(
         predicate=predicate_told,
         terms=[Entity(name="Henry"),
                Entity(name="Jenna"), shot],
     )
     factors = told.recursive_terms
     assert factors["<Alice>"].compare_keys(Entity(name="Alice"))
Ejemplo n.º 17
0
 def test_generic_terms_with_different_text_equal(self):
     predicate = Predicate(content="$speaker greeted $listener")
     different_predicate = Predicate(content="$speaker attacked $listener")
     fact = Fact(
         predicate=predicate,
         terms=[Entity(name="Al"), Entity(name="Meg")],
         generic=True,
     )
     different_fact = Fact(
         predicate=different_predicate,
         terms=[Entity(name="Al"), Entity(name="Meg")],
         generic=True,
     )
     assert fact.means(different_fact)
Ejemplo n.º 18
0
 def test_contradicts_if_present_one_absent(self):
     shot_fact = Fact(
         predicate=Predicate(content="$shooter shot $victim"),
         terms=[Entity(name="Alice"),
                Entity(name="Bob")],
     )
     shot_false = Fact(
         predicate=Predicate(content="$shooter shot $victim", truth=False),
         terms=[Entity(name="Alice"),
                Entity(name="Bob")],
         absent=True,
     )
     assert shot_fact._contradicts_if_present(shot_false, ContextRegister())
     assert shot_false._contradicts_if_present(shot_fact, ContextRegister())