Stáhnout: 8.3_27.py   Zobrazit: jednoduše   8.3_27.pl

#!/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()

% 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.

 Stáhnout: 8.3_27.py   Zobrazit: jednoduše   8.3_27.pl