Decision tables: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: no_empty param is no more) |
|||
Line 1,418: | Line 1,418: | ||
Check the printer-computer cable |
Check the printer-computer cable |
||
Ensure printer software is installed</pre> |
Ensure printer software is installed</pre> |
||
=={{header|Nim}}== |
|||
We have defined a generic decision table object and used it with the Wikipedia printer example. |
|||
<lang Nim>import strutils, tables |
|||
#################################################################################################### |
|||
# Generic defintion of the decision table. |
|||
type |
|||
DTable[Cond, Act: Ordinal] = object |
|||
questions: array[Cond, string] |
|||
answers: array[Act, string] |
|||
rules: Table[set[Cond], seq[Act]] |
|||
proc initDTable[Cond, Act](): DTable[Cond, Act] = discard |
|||
proc addCondition[Cond, Act](dt: var DTable[Cond, Act]; cond: Cond; question: string) = |
|||
if dt.questions[cond].len != 0: |
|||
raise newException(ValueError, "condition already set: " & $cond) |
|||
dt.questions[cond] = question |
|||
proc addAction[Cond, Act](dt: var DTable[Cond, Act]; act: Act; answer: string) = |
|||
if dt.answers[act].len != 0: |
|||
raise newException(ValueError, "action already set: " & $act) |
|||
dt.answers[act] = answer |
|||
proc addRule[Cond, Act](dt: var DTable[Cond, Act]; rule: set[Cond]; acts: openArray[Act]) = |
|||
if rule in dt.rules: |
|||
raise newException(ValueError, "rule already set.") |
|||
dt.rules[rule] = @acts |
|||
proc askQuestion(question: string): string = |
|||
while true: |
|||
stdout.write question & ' ' |
|||
stdout.flushFile() |
|||
result = stdin.readLine().strip() |
|||
if result in ["y", "n"]: break |
|||
proc apply[Cond, Act](dt: DTable[Cond, Act]) = |
|||
# Build condition set. |
|||
var conds: set[Cond] |
|||
echo "Answer questions with 'y' or 'n'" |
|||
for cond, question in dt.questions: |
|||
if question.len == 0: |
|||
raise newException(ValueError, "missing question for condition: " & $cond) |
|||
let answer = askQuestion(question) |
|||
if answer == "y": |
|||
conds.incl cond |
|||
# Apply rule. |
|||
echo() |
|||
if conds in dt.rules: |
|||
echo "Actions recommended:" |
|||
for act in dt.rules[conds]: |
|||
echo "- ", dt.answers[act] |
|||
else: |
|||
echo "No action recommended." |
|||
#################################################################################################### |
|||
# Decision table for Wikipedia printer example. |
|||
type |
|||
Condition {.pure.} = enum PrinterPrints, RedLightFlashing, PrinterRecognized |
|||
Action {.pure.} = enum CheckPowerCable, CheckPrinterCable, CheckSoftware, CheckInk, CheckPaperJam |
|||
const |
|||
Questions = [PrinterPrints: "Does printer print?", |
|||
RedLightFlashing: "Does red light is flashing?", |
|||
PrinterRecognized: "Is printer recognized by computer?"] |
|||
Answers = [CheckPowerCable: "check the power cable", |
|||
CheckPrinterCable: "check the printer-computer cable", |
|||
CheckSoftware: "ensure printer software is installed", |
|||
CheckInk: "check/replace ink", |
|||
CheckPaperJam: "check for paper jam"] |
|||
var dt = initDTable[Condition, Action]() |
|||
for cond, question in Questions: |
|||
dt.addCondition(cond, question) |
|||
for act, answer in Answers: |
|||
dt.addAction(act, answer) |
|||
dt.addRule({}, [CheckPowerCable, CheckPrinterCable, CheckSoftware]) |
|||
dt.addRule({PrinterPrints}, [CheckSoftware]) |
|||
dt.addRule({RedLightFlashing}, [CheckPrinterCable, CheckSoftware, CheckInk]) |
|||
dt.addRule({PrinterRecognized}, [CheckPaperJam]) |
|||
dt.addRule({PrinterPrints, RedLightFlashing}, [CheckSoftware]) |
|||
dt.addRule({RedLightFlashing, PrinterRecognized}, [CheckInk, CheckPaperJam]) |
|||
dt.addRule({PrinterPrints, RedLightFlashing, PrinterRecognized}, [CheckInk]) |
|||
dt.apply()</lang> |
|||
{{out}} |
|||
<pre>Answer questions with 'y' or 'n' |
|||
Does printer print? n |
|||
Does red light is flashing? y |
|||
Is printer recognized by computer? y |
|||
Actions recommended: |
|||
- check/replace ink |
|||
- check for paper jam</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |