Get resolution working for real!

This commit is contained in:
Emi Simpson 2023-03-06 11:53:24 -05:00
parent 475c324e64
commit 6353522827
Signed by: Emi
GPG key ID: A12F2C2FFDC3D847

View file

@ -148,6 +148,14 @@ True
False
"""
false_clause: Clause = FSet()
"""
The clause which represents the logical condition False
i.e. the empty clause
"""
def next_generation(
previous_generations: KnowledgeBase_,
current_generation: KnowledgeBase_,
@ -204,6 +212,45 @@ def next_generation(
"""
return fset(*derive(current_generation), *derive2(current_generation, previous_generations))
def derives_false(
knowledge_base: KnowledgeBase,
previous_generations: KnowledgeBase = FSet(),
) -> bool:
"""
Determine if it is possible to derive false from a given knowledge base.
Uses any number of generations of resolution via `next_generation()` to find a
generation which contains the `false_clause`, indicating that the original knowledge
base (and all subsiquent generations) are contradictory.
`previous_generations` may be set if the current knowledge base was derived from some
other series of clauses using `derive()`.
>>> derives_false(fset(
... fset( IRNeg(IRProp('animal', (IRProp('Kim'),))) ),
... fset( IRNeg(IRProp('dog', (IRVar('x0'),))), IRProp('animal', (IRVar('x0'),)) ),
... fset( IRNeg(IRProp('cat', (IRVar('x1'),))), IRProp('animal', (IRVar('x1'),)) ),
... fset( IRProp('dog', (IRProp('Kim'),)) ),
... ))
True
>>> derives_false(fset(
... fset( IRNeg(IRProp('animal', (IRProp('Kim'),))) ),
... fset( IRNeg(IRProp('dog', (IRVar('x0'),))), IRProp('animal', (IRVar('x0'),)) ),
... fset( IRNeg(IRProp('cat', (IRVar('x1'),))), IRProp('animal', (IRVar('x1'),)) ),
... ))
False
"""
if false_clause in knowledge_base:
return True
elif len(knowledge_base) == 0:
return False
else:
return derives_false(
next_generation(previous_generations, knowledge_base),
knowledge_base | previous_generations
)
if __name__ == '__main__':
import doctest