Exemple #1
0
 def test_contradiction_of_group(self):
     lived_at = Predicate(content="$person lived at $residence")
     bob_lived = Fact(
         predicate=lived_at, terms=[Entity(name="Bob"), Entity(name="Bob's house")]
     )
     carl_lived = Fact(
         predicate=lived_at, terms=[Entity(name="Carl"), Entity(name="Carl's house")]
     )
     distance_long = Comparison(
         content="the distance from the center of $city to $residence was",
         sign=">=",
         expression="50 miles",
     )
     statement_long = Fact(
         predicate=distance_long,
         terms=[Entity(name="Houston"), Entity(name="Bob's house")],
     )
     distance_short = Comparison(
         content="the distance from the center of $city to $residence was",
         sign="<=",
         expression="10 kilometers",
     )
     statement_short = Fact(
         predicate=distance_short,
         terms=[Entity(name="El Paso"), Entity(name="Carl's house")],
     )
     left = FactorGroup([bob_lived, statement_long])
     right = FactorGroup([carl_lived, statement_short])
     explanation = left.explain_contradiction(right)
     assert explanation.context["<Houston>"].name == "El Paso"
     assert contradicts(left, right)
Exemple #2
0
class TestConsistent:
    p_small_weight = Comparison(
        content="the amount of gold $person possessed was",
        sign="<",
        expression=Q_("1 gram"),
    )
    p_large_weight = Comparison(
        content="the amount of gold $person possessed was",
        sign=">=",
        expression=Q_("100 kilograms"),
    )
    small = Fact(predicate=p_large_weight, terms=Entity(name="Alice"))
    big = Fact(predicate=p_small_weight, terms=Entity(name="Bob"))

    def test_contradictory_facts_about_same_entity(self):
        register = ContextRegister()
        register.insert_pair(Entity(name="Alice"), Entity(name="Bob"))
        assert not self.small.consistent_with(self.big, register)
        explanations = list(
            self.small.explanations_consistent_with(self.big,
                                                    context=register))
        assert not explanations

    def test_factor_consistent_with_none(self):
        assert self.small.consistent_with(None)
Exemple #3
0
    def test_interchangeable_terms_in_factorgroup(self):
        """Fails whether the method is 'comparison' or '_verbose_comparison'"""
        left = FactorGroup([
            Statement(
                predicate=Comparison(
                    content="the distance between $place1 and $place2 was",
                    truth=True,
                    sign="<=",
                    expression="35 foot",
                ),
                terms=(
                    Entity(name="Scylla", generic=True, plural=False),
                    Entity(name="Charybdis", generic=True, plural=False),
                ),
            ),
            Statement(
                predicate=Comparison(
                    content=
                    "the distance between ${monster} and a boat used by ${hero} was",
                    truth=True,
                    sign="<=",
                    expression="5 foot",
                ),
                terms=(
                    Entity(name="Scylla", generic=True, plural=False),
                    Entity(name="Ulysses", generic=True, plural=False),
                ),
            ),
        ])

        right = FactorGroup([
            Statement(
                predicate=Comparison(
                    content="the distance between $place1 and $place2 was",
                    truth=True,
                    sign="<=",
                    expression="35 foot",
                ),
                terms=(
                    Entity(name="Charybdis", generic=True, plural=False),
                    Entity(name="Scylla", generic=True, plural=False),
                ),
            ),
            Statement(
                predicate=Comparison(
                    content=
                    "the distance between $thing and a boat used by $person was",
                    truth=True,
                    sign="<=",
                    expression="5 foot",
                ),
                terms=(
                    Entity(name="Scylla", generic=True, plural=False),
                    Entity(name="Ulysses", generic=True, plural=False),
                ),
            ),
        ])
        gen = left.explanations_implication(right)
        result = next(gen)
        assert result
Exemple #4
0
 def test_round_trip(self):
     predicate = Comparison(
         **{"content": "{}'s favorite number was", "sign": "==", "expression": 42}
     )
     dumped = predicate.dict()
     new_statement = Comparison(**dumped)
     assert "{}'s favorite number was exactly equal to 42" in str(new_statement)
Exemple #5
0
 def test_compare_intervals_different_units(self):
     miles = Comparison(
         content="the distance was", sign="<", expression=Q_("30 miles")
     )
     kilos = Comparison(
         content="the distance was", sign="<", expression=Q_("40 kilometers")
     )
     assert kilos.quantity_range.implies(miles.quantity_range)
Exemple #6
0
 def test_dump_comparison_with_date_expression(self):
     copyright_date_range = Comparison(
         content="the date when $work was created was",
         sign=">=",
         expression=date(1978, 1, 1),
     )
     dumped = copyright_date_range.dict()
     assert dumped["quantity_range"]["quantity"] == date(1978, 1, 1)
Exemple #7
0
 def test_no_duplicate_explanations_consistent(self):
     large_payments = FactorGroup([
         Statement(
             predicate=Comparison(
                 content=
                 "the number of dollars that $payer paid to $payee was",
                 sign=">",
                 expression=10000,
             ),
             terms=[Entity(name="Alice"),
                    Entity(name="Bob")],
         ),
         Statement(
             predicate=Comparison(
                 content=
                 "the number of dollars that $payer paid to $payee was",
                 sign=">",
                 expression=1000,
             ),
             terms=[Entity(name="Dan"),
                    Entity(name="Eve")],
         ),
     ])
     small_payments = FactorGroup([
         Statement(
             predicate=Comparison(
                 content=
                 "the number of dollars that $payer paid to $payee was",
                 sign=">",
                 expression=100,
             ),
             terms={
                 "payer": Entity(name="Fred"),
                 "payee": Entity(name="Greg")
             },
         ),
         Statement(
             predicate=Comparison(
                 content=
                 "the number of dollars that $payer paid to $payee was",
                 sign=">",
                 expression=10,
             ),
             terms={
                 "payer": Entity(name="Jim"),
                 "payee": Entity(name="Kim")
             },
         ),
     ])
     assert large_payments.consistent_with(small_payments)
     all_explanations = list(
         large_payments.explanations_consistent_with(small_payments))
     assert len(all_explanations) == 24
     limited_explanations = list(
         large_payments.explanations_consistent_with(
             small_payments,
             context=([Entity(name="Alice")], [Entity(name="Jim")])))
     assert len(limited_explanations) == 6
Exemple #8
0
 def test_no_contradiction_of_predicate(self):
     more_cows = Comparison(
         content="the number of cows $person owned was",
         sign=">",
         expression=10,
     )
     no_cows = Predicate(content="the number of cows $person owned was", truth=False)
     assert not more_cows.contradicts(no_cows)
     assert not no_cows.contradicts(more_cows)
Exemple #9
0
 def test_reuse_quantity_range_for_contradiction(self):
     dogs = Comparison(content="the number of dogs was", sign=">", expression=3)
     cats = Comparison(
         content="the number of cats was", quantity_range=dogs.quantity_range
     )
     fewer_cats = Comparison(
         content="the number of cats was", sign="<", expression=3
     )
     assert cats.contradicts(fewer_cats)
Exemple #10
0
 def test_dump_to_dict_with_units(self):
     predicate = Comparison(
         content="the distance between $place1 and $place2 was",
         truth=True,
         sign="<>",
         expression=Q_("35 feet"),
     )
     dumped = predicate.dict()
     assert dumped["quantity_range"]["quantity"] == "35 foot"
Exemple #11
0
    def test_interchangeable_terms_in_different_orders(self):
        more_than_100_yards = Comparison(
            content="the distance between $site1 and $site2 was",
            sign=">",
            expression="100 yards",
        )
        less_than_1_mile = Comparison(
            content="the distance between $site1 and $site2 was",
            sign="<",
            expression="1 mile",
        )

        protest_facts = FactorGroup([
            Statement(
                predicate=more_than_100_yards,
                terms=[
                    Entity(name="the political convention"),
                    Entity(name="the police cordon"),
                ],
            ),
            Statement(
                predicate=less_than_1_mile,
                terms=[
                    Entity(name="the police cordon"),
                    Entity(name="the political convention"),
                ],
            ),
        ])
        assert "between <the political convention> and " in str(protest_facts)
        more_than_50_meters = Comparison(
            content="the distance between $site1 and $site2 was",
            sign=">",
            expression="50 meters",
        )
        less_than_2_km = Comparison(
            content="the distance between $site1 and $site2 was",
            sign="<=",
            expression="2 km",
        )

        speech_zone_facts = FactorGroup([
            Statement(
                predicate=more_than_50_meters,
                terms=[
                    Entity(name="the free speech zone"),
                    Entity(name="the courthouse"),
                ],
            ),
            Statement(
                predicate=less_than_2_km,
                terms=[
                    Entity(name="the free speech zone"),
                    Entity(name="the courthouse"),
                ],
            ),
        ])
        assert protest_facts.implies(speech_zone_facts)
Exemple #12
0
 def test_no_contradiction_inconsistent_dimensions(self):
     equal = Comparison(
         content="${defendant}'s sentence was", sign="=", expression="8 years"
     )
     less = Comparison(
         content="${defendant}'s sentence was", sign="<=", expression="10 parsecs"
     )
     assert not equal.contradicts(less)
     assert not equal.implies(less)
Exemple #13
0
 def test_no_contradiction_exact_different_unit(self):
     acres = Comparison(
         content="the size of the farm was", sign=">", expression=Q_("20 acres")
     )
     kilometers = Comparison(
         content="the size of the farm was",
         sign="=",
         expression=Q_("100 square kilometers"),
     )
     assert not acres.contradicts(kilometers)
Exemple #14
0
 def test_comparison_implies_predicate_false(self):
     distance = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression="20 miles",
     )
     predicate = Predicate(content="the distance between $place1 and $place2 was")
     assert not distance.implies(predicate)
     assert not distance.contradicts(predicate)
     assert not predicate.contradicts(distance)
Exemple #15
0
 def test_predicate_not_same_with_interchangeable_terms(self):
     interchangeable = Comparison(
         content="the distance between $place1 and $place2 was",
         sign="<",
         expression=Q_("20 feet"),
     )
     not_interchangeable = Comparison(
         content="the distance between $west and $east was",
         sign="<",
         expression=Q_("20 feet"),
     )
     assert not interchangeable.means(not_interchangeable)
Exemple #16
0
 def test_same_volume(self):
     volume_in_liters = Comparison(
         content="the volume of fuel in the tank was",
         sign="=",
         expression="10 liters",
     )
     volume_in_milliliters = Comparison(
         content="the volume of fuel in the tank was",
         sign="=",
         expression="10000 milliliters",
     )
     assert volume_in_liters.means(volume_in_milliliters)
Exemple #17
0
 def test_term_outside_of_group(self):
     speed = "${person}'s speed was"
     comparison = Comparison(content=speed,
                             sign=">",
                             expression="36 kilometers per hour")
     other = Comparison(content=speed,
                        sign=">",
                        expression="10 meters per second")
     left = FactorGroup(
         Statement(predicate=comparison, terms=Entity(name="Ann")))
     right = Statement(predicate=other, terms=Entity(name="Bob"))
     assert left.means(right)
Exemple #18
0
 def test_not_equal_implies(self):
     meters = Comparison(
         content="the length of the football field was",
         sign="!=",
         expression="1000 meter",
     )
     kilometers = Comparison(
         content="the length of the football field was",
         sign="!=",
         expression="1 kilometer",
     )
     assert meters.means(kilometers)
Exemple #19
0
 def test_not_equal_does_not_imply(self):
     yards = Comparison(
         content="the length of the football field was",
         sign="!=",
         expression="100 yards",
     )
     meters = Comparison(
         content="the length of the football field was",
         sign="!=",
         expression="80 meters",
     )
     assert not yards >= meters
Exemple #20
0
 def test_implication_due_to_dates(self):
     copyright_date_range = Comparison(
         content="the date when $work was created was",
         sign=">=",
         expression="1978-01-01",
     )
     copyright_date_specific = Comparison(
         content="the date when $work was created was",
         sign="=",
         expression=date(1980, 6, 20),
     )
     assert copyright_date_specific.implies(copyright_date_range)
Exemple #21
0
 def test_no_comparison_with_comparison(self):
     comparison = Comparison(
         content="${person}'s speed was",
         sign=">",
         expression="36 kilometers per hour",
     )
     other_comparison = Comparison(content="${person}'s speed was",
                                   sign=">",
                                   expression="10 meters per second")
     left = FactorGroup(
         Statement(predicate=comparison, terms=Entity(name="Ann")))
     assert not left.means(other_comparison)
Exemple #22
0
 def test_cannot_convert_date_to_time_period(self):
     time = Comparison(
         content="the time $object took to biodegrade was",
         sign=">",
         expression=Q_("2000 years"),
     )
     day = Comparison(
         content="the day was",
         sign="=",
         expression=date(2020, 1, 1),
     )
     with pytest.raises(TypeError):
         time.quantity_range.get_unit_converted_interval(day.quantity_range)
Exemple #23
0
 def test_inconsistent_dimensionality_date(self):
     number = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression=20,
     )
     day = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression=date(2000, 1, 1),
     )
     assert not number.quantity_range.consistent_dimensionality(day.quantity_range)
     assert not day.quantity_range.consistent_dimensionality(number.quantity_range)
Exemple #24
0
 def test_does_not_exclude_other_quantity(self):
     comparison = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression=Q_("20 miles"),
     )
     comparison_opposite = Comparison(
         content="the distance between $place1 and $place2 was",
         sign="<",
         expression=Q_("30 miles"),
     )
     left = comparison.quantity_range
     right = comparison_opposite.quantity_range
     assert left.contradicts(right.interval) is False
Exemple #25
0
 def test_convert_quantity_of_Comparison(self):
     comparison = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression=Q_("20 miles"),
     )
     comparison_km = Comparison(
         content="the distance between $place1 and $place2 was",
         sign=">",
         expression=Q_("30 kilometers"),
     )
     result = comparison.quantity_range.get_unit_converted_interval(
         comparison_km.quantity_range
     )
     assert 18 < result.left < 19
Exemple #26
0
 def test_no_implication_pint_quantity_and_int(self):
     fact_exact = Fact(
         predicate=Comparison(content="${person}'s height was",
                              sign="=",
                              expression=66),
         terms=Entity(name="Alice"),
     )
     fact_greater = Fact(
         predicate=Comparison(content="${person}'s height was",
                              sign=">",
                              expression="60 inches"),
         terms=Entity(name="Alice"),
     )
     assert not fact_exact >= fact_greater
     assert not fact_greater >= fact_exact
Exemple #27
0
 def test_plural_in_comparison(self):
     comparison = Comparison(
         content="the weights of ${the defendants} were",
         sign=">",
         expression="200 pounds",
     )
     assert comparison.content.endswith("was")
Exemple #28
0
 def test_comparison_with_wrong_comparison_symbol(self):
     with pytest.raises(ValueError):
         _ = Comparison(
             content="the height of {} was {}",
             sign=">>",
             expression=Q_("160 centimeters"),
         )
Exemple #29
0
 def test_string_for_date_as_expression(self):
     copyright_date_range = Comparison(
         content="the date when $work was created was",
         sign=">=",
         expression=date(1978, 1, 1),
     )
     assert "1978" in str(copyright_date_range)
Exemple #30
0
 def test_comparison_negative_attr(self):
     comparison = Comparison(
         content="the balance in the bank account was", sign="<=", expression=-100
     )
     assert comparison.quantity_range.magnitude == -100
     assert comparison.quantity_range._include_negatives is True
     assert comparison.interval.end == -100