Get resolution working for real!
This commit is contained in:
parent
475c324e64
commit
6353522827
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue