home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / ckscripts / rulebase < prev    next >
Lisp/Scheme  |  2020-01-01  |  2KB  |  122 lines

  1. # From: "Dat Nguyen" <thucdat@hotmail.com>
  2. # Subject: Rule-based Programming
  3. # Date: Thu, 13 May 2004 13:49:06 -0400
  4. #
  5. # A typical rule-based problem is car repair. A demonstrative 
  6. # implementation in C-Kermit is shown here:
  7. #
  8. define say { echo \%1 }
  9.  
  10. define addFact {
  11.     local \%i
  12.     for \%i 1 \v(argc)-1 1 {
  13.         asg FactDatabase \m(FactDatabase)\&_[\%i]|
  14.         incr FactNumber
  15.     }
  16. #   showFact
  17. }
  18.  
  19. define removeFact {
  20.     local \%i
  21.     for \%i 1 \v(argc)-1 1 {
  22.         asg FactDatabase \freplace(\m(FactDatabase),|\&_[\%i]|,|)
  23.         decr FactNumber
  24.     }
  25. #   showFact
  26. }
  27.  
  28. define anyFact {
  29.     (FactNumber)
  30. }
  31.  
  32. define hasFact {
  33.     (\find(\%1,\m(FactDatabase)))
  34. }
  35.  
  36. define removeAllFact {
  37.     asg FactDatabase |
  38.     (setq FactNumber 0)
  39. }
  40.  
  41. define showFact {
  42.     show mac FactDatabase
  43.     show mac FactNumber
  44. }
  45.  
  46. define addGoal {
  47.     local \%i
  48.     for \%i 1 \v(argc)-1 1 {
  49.         asg GoalDatabase \m(GoalDatabase)\&_[\%i]|
  50.         incr GoalNumber
  51.     }
  52. #   showGoal
  53. }
  54.  
  55. define removeGoal {
  56.     local \%i
  57.     for \%i 1 \v(argc)-1 1 {
  58.         asg GoalDatabase \freplace(\m(GoalDatabase),|\&_[\%i]|,|)
  59.         decr GoalNumber
  60.     }
  61. #   showGoal
  62. }
  63.  
  64. define allGoalDone {
  65.     (! GoalNumber)
  66. }
  67.  
  68. define hasGoal {
  69.     (\find(\%1,\m(GoalDatabase)))
  70. }
  71.  
  72. define removeAllGoal {
  73.     asg GoalDatabase |
  74.     (setq GoalNumber 0)
  75. }
  76.  
  77. define showGoal {
  78.     show mac GoalDatabase
  79.     show mac GoalNumber
  80. }
  81.  
  82. define fireRule {
  83.     local \&e[] \%n \%i fired
  84.     asg \%n \fsplit(\%1,&e,{ })
  85.     while true {
  86.         for \%i 1 \%n 1 {
  87.             if define \m(\&e[\%i]) {
  88.                 asg fired \fexec(\&e[\%i])
  89.                 # if rule was fired, reevaluate all rules 
  90.                 if fired {
  91.                     echo {\&e[\%i] was *fired*}
  92.                     break
  93.                 }
  94.             }
  95.         }
  96.         if not fired break                # no rule was fired
  97.         if = 1 \fexec(allGoalDone) break  # all goals achieved
  98.     }
  99.     echo
  100.     echo {That's all there is}
  101.     echo
  102. }
  103.  
  104. define rule_sample {
  105.     (if (hasGoal 'Goal_xxx)
  106.         (if (hasFact 'Fact_yyy)
  107.             (if (not (hasGoal 'Goal_zzz))
  108.                 (.
  109.                     (removeGoal 'Goal_xxx)  # Goal achieved
  110.                     (removeFact 'Fact_yyy)  # Fact changed
  111.                     (addGoal 'Fact_www)     # New goal
  112.                     (addFact 'Fact_yyy)     # New fact
  113.                     (1)
  114.                 )
  115.                 (0)
  116.             )
  117.             (0)
  118.         )
  119.         (0)
  120.     )
  121. }
  122.