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())
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
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)
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)
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}, }
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)
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), ]
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
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
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)
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)
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
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
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
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()
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"))
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)
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())