This example is about build a set of rules to determine if someone should wear contact lens and if so, if the lens should be hard or soft. We first define the relevant attributes we need.
The following is a list of the propositions that are allowed in the RDR rules:
propositions([ young, pre_presbyopic, presbyopic, % age myope, hypermetrope, % prescription astigmatic, not_astigmatic, % astigmatism reduced, normal % tear production ]).
It is not important to know what presbyopic, etc mean. They are
just the names and optometrist would use describe a person's age, and other
attributes.
Here is a list of all the cases that will be entered into the RDR system. Each case has:
case(0, []). case(1, [young, myope, not_astigmatic, reduced]). % none case(2, [young, myope, not_astigmatic, normal]). % soft case(3, [young, myope, astigmatic, reduced]). % none case(4, [young, myope, astigmatic, normal]). % hard case(5, [young, hypermetrope, not_astigmatic, reduced]). % none case(6, [young, hypermetrope, not_astigmatic, normal]). % soft case(7, [young, hypermetrope, astigmatic, reduced]). % none case(8, [young, hypermetrope, astigmatic, normal]). % hard case(9, [pre_presbyopic, myope, not_astigmatic, reduced]). % none case(10, [pre_presbyopic, myope, not_astigmatic, normal]). % soft case(11, [pre_presbyopic, myope, astigmatic, reduced]). % none case(12, [pre_presbyopic, myope, astigmatic, normal]). % hard case(13, [pre_presbyopic, hypermetrope, not_astigmatic, reduced]). % none case(14, [pre_presbyopic, hypermetrope, not_astigmatic, normal]). % soft case(15, [pre_presbyopic, hypermetrope, astigmatic, reduced]). % none case(16, [pre_presbyopic, hypermetrope, astigmatic, normal]). % none case(17, [presbyopic, myope, not_astigmatic, reduced]). % none case(18, [presbyopic, myope, not_astigmatic, normal]). % none case(19, [presbyopic, myope, astigmatic, reduced]). % none case(20, [presbyopic, myope, astigmatic, normal]). % hard case(21, [presbyopic, hypermetrope, not_astigmatic, reduced]). % none case(22, [presbyopic, hypermetrope, not_astigmatic, normal]). % soft case(23, [presbyopic, hypermetrope, astigmatic, reduced]). % none case(24, [presbyopic, hypermetrope, astigmatic, normal]). % none
The RDR system starts with a default rule which says no-one gets a contact lens. There is a dummy case (0) which has no propositions.
rule is if true then none because 0.
The following is a transcript of a session with an RDR system. It shows how the RDR is built as each new case is entered.
The RDR systems displays the new case, draws a conclusion and then asks if the conclusion is correct. For convenience, we show the correct conclusion in parentheses. Normally, this would only be known to the expert.
If the RDR's conclusion is incorrect, the system looks at the differences between the corner stone case, ie. the case which caused the creation of the rule that fired and the new case. The system asks if each of the differences is relevant to distinguishing the cases.
Each yes answer causes a condition to be added to a new rule. The new RDR is printed out when all the differences have been checked. The whole process is repeated for each rule.
Case 1: [young, myope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y
Case 2: [young, myope, not_astigmatic, normal] Is none the correct conclusion (should be soft)? n What is the correct conclusion? soft Corner stone case is: [] Is young correct? n Is myope correct? n Is not_astigmatic correct? y Is normal correct? y The new rdr is: if true then none because 0 except if not_astigmatic and normal then soft because 2 Case 3: [young, myope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 4: [young, myope, astigmatic, normal] Is none the correct conclusion (should be hard)? n What is the correct conclusion? hard Corner stone case is: [] Is young correct? n Is myope correct? y Is astigmatic correct? n Is normal correct? y The new rdr is: if true then none because 0 except if not_astigmatic and normal then soft because 2 else if myope and normal then hard because 4 Case 5: [young, hypermetrope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 6: [young, hypermetrope, not_astigmatic, normal] Is soft the correct conclusion (should be soft)? y Case 7: [young, hypermetrope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 8: [young, hypermetrope, astigmatic, normal] Is none the correct conclusion (should be hard)? n What is the correct conclusion? hard Corner stone case is: [] Is young correct? y Is hypermetrope correct? n Is astigmatic correct? n Is normal correct? y The new rdr is: if true then none because 0 except if not_astigmatic and normal then soft because 2 else if myope and normal then hard because 4 else if young and normal then hard because 8 Case 9: [pre_presbyopic, myope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 10: [pre_presbyopic, myope, not_astigmatic, normal] Is soft the correct conclusion (should be soft)? y Case 11: [pre_presbyopic, myope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 12: [pre_presbyopic, myope, astigmatic, normal] Is hard the correct conclusion (should be hard)? y Case 13: [pre_presbyopic, hypermetrope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 14: [pre_presbyopic, hypermetrope, not_astigmatic, normal] Is soft the correct conclusion (should be soft)? y Case 15: [pre_presbyopic, hypermetrope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 16: [pre_presbyopic, hypermetrope, astigmatic, normal] Is none the correct conclusion (should be none)? y Case 17: [presbyopic, myope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 18: [presbyopic, myope, not_astigmatic, normal] Is soft the correct conclusion (should be none)? n What is the correct conclusion? none Corner stone case is: [young, myope, not_astigmatic, normal] Is presbyopic correct? y Is not young correct? n The new rdr is: if true then none because 0 except if not_astigmatic and normal then soft because 2 except if presbyopic then none because 18 else if myope and normal then hard because 4 else if young and normal then hard because 8 Case 19: [presbyopic, myope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 20: [presbyopic, myope, astigmatic, normal] Is hard the correct conclusion (should be hard)? y Case 21: [presbyopic, hypermetrope, not_astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 22: [presbyopic, hypermetrope, not_astigmatic, normal] Is none the correct conclusion (should be soft)? n What is the correct conclusion? soft Corner stone case is: [presbyopic, myope, not_astigmatic, normal] Is hypermetrope correct? n Is not myope correct? y The new rdr is: if true then none because 0 except if not_astigmatic and normal then soft because 2 except if presbyopic then none because 18 except if not myope then soft because 22 else if myope and normal then hard because 4 else if young and normal then hard because 8 Case 23: [presbyopic, hypermetrope, astigmatic, reduced] Is none the correct conclusion (should be none)? y Case 24: [presbyopic, hypermetrope, astigmatic, normal] Is none the correct conclusion (should be none)? y