% nacteni:
/* ['8.3_27.pl']. */
:- op( 800, fx , if ),
op( 700, xfx, then),
op( 300, xfy, or),
op( 200, xfy, and).
% rules
if
mokra_chodba and sucha_kuchyn
then
tece_v_koupelne.
if
mokra_chodba and sucha_koupelna
then
problem_v_kuchyni.
if
okno_zavrene or neprsi
then
nezatika_zvenci.
if
problem_v_kuchyni and nezatika_zvenci
then
tece_v_kuchyni.
% facts
fact(mokra_chodba).
fact(sucha_koupelna).
fact(okno_zavrene).
forward :- new_derived_fact( P), !,
write('Derived: '), write( P), nl,
assert( fact( P)),
forward
; write('No more facts').
new_derived_fact( Concl) :- if Cond then Concl,
\+ fact( Concl),
composed_fact( Cond).
composed_fact(Cond) :- fact( Cond).
composed_fact(Cond1 and Cond2) :- composed_fact( Cond1),
composed_fact(Cond2).
composed_fact(Cond1 or Cond2) :- composed_fact( Cond1) ;
composed_fact( Cond2).
:- forward.
Derived: problem_v_kuchyni
Derived: nezatika_zvenci
Derived: tece_v_kuchyni
No more facts
| #!/usr/bin/env python
# encoding=utf-8 (pep 0263)
KNOWLEDGE_BASE=[
# rules
('if',\
['mokra_chodba', 'and', 'sucha_kuchyn'],\
'then',\
'tece_v_koupelne'),
('if',\
['mokra_chodba', 'and', 'sucha_koupelna'],\
'then',\
'problem_v_kuchyni'),
('if',\
['okno_zavrene', 'or', 'neprsi'],\
'then',\
'nezatika_zvenci'),
('if',\
['problem_v_kuchyni', 'and', 'nezatika_zvenci'],\
'then',\
'tece_v_kuchyni'),
# facts
('fact', 'mokra_chodba'),
('fact', 'sucha_koupelna'),
('fact', 'okno_zavrene'),
]
def forward():
while True:
p = new_derived_fact()
if p is None:
break
print 'Derived: ', p
KNOWLEDGE_BASE.insert(0, ('fact',p))
print 'No more facts'
def new_derived_fact():
for sentence in KNOWLEDGE_BASE:
if sentence[0] != 'if':
continue
sent_type, condition, then, conclusion = sentence
if ('fact',conclusion) not in KNOWLEDGE_BASE and composed_fact(condition):
return conclusion
def composed_fact(cond):
if type(cond) == list:
cond1, operator, cond2 = cond
if operator == 'and':
return (composed_fact(cond1) and composed_fact(cond2))
if operator == 'or':
return (composed_fact(cond1) or composed_fact(cond2))
return False
return (('fact', cond) in KNOWLEDGE_BASE)
# demonstracni vypis
if __name__ == "__main__":
forward()
Derived: problem_v_kuchyni
Derived: nezatika_zvenci
Derived: tece_v_kuchyni
No more facts
|