001 /*
002 @license.text@
003 */
004 package com.hammurapi.reasoning.tutorial.rules;
005
006 import com.hammurapi.reasoning.spi.Condition;
007 import com.hammurapi.reasoning.spi.Infer;
008 import com.hammurapi.reasoning.spi.InferenceContext;
009 import com.hammurapi.reasoning.tutorial.objectmodel.Aunt;
010 import com.hammurapi.reasoning.tutorial.objectmodel.Brother;
011 import com.hammurapi.reasoning.tutorial.objectmodel.Child;
012 import com.hammurapi.reasoning.tutorial.objectmodel.Cousin;
013 import com.hammurapi.reasoning.tutorial.objectmodel.Daughter;
014 import com.hammurapi.reasoning.tutorial.objectmodel.Husband;
015 import com.hammurapi.reasoning.tutorial.objectmodel.Nephew;
016 import com.hammurapi.reasoning.tutorial.objectmodel.Niece;
017 import com.hammurapi.reasoning.tutorial.objectmodel.Parent;
018 import com.hammurapi.reasoning.tutorial.objectmodel.Sibling;
019 import com.hammurapi.reasoning.tutorial.objectmodel.Sister;
020 import com.hammurapi.reasoning.tutorial.objectmodel.Son;
021 import com.hammurapi.reasoning.tutorial.objectmodel.Uncle;
022 import com.hammurapi.reasoning.tutorial.objectmodel.Wife;
023
024 /**
025 * Infers aunt, uncle, cousin, niece, nephew
026 * @author Pavel Vlasov
027 * @revision $Revision$
028 */
029 public class SecondaryRules {
030
031 /**
032 * Infers cousin as a child or parent's sibling.
033 */
034 @Infer(Cousin.class)
035 public void infer(Child child1, Child child2, Sibling sibling) {
036 if (child1.getObject().equals(sibling.getSubject()) && child2.getObject().equals(sibling.getObject())) {
037 InferenceContext.INSTANCE.post(new Cousin(child1.getSubject(), child2.getSubject()));
038 }
039 }
040
041 /**
042 * If A is a cousin of B then B is a cousin of A
043 * @param cousin
044 * @return
045 */
046 @Infer
047 public Cousin infer(Cousin cousin) {
048 return new Cousin(cousin.getObject(), cousin.getSubject());
049 }
050
051 /**
052 * Another way to infer cousin to demonstrate mutiple derivations
053 * @param aunt
054 * @param child
055 */
056 @Infer
057 @Condition("arg0.getSubject().equals(arg1.getSubject())")
058 public Cousin infer(Aunt aunt, Parent parent) {
059 return new Cousin(aunt.getObject(), parent.getObject());
060 }
061
062 /**
063 * Another way to infer cousin to demonstrate mutiple derivations
064 * @param uncle
065 * @param child
066 */
067 @Infer
068 public Cousin infer(Uncle uncle, Parent parent) {
069 if (uncle.getSubject().equals(parent.getSubject())) {
070 return new Cousin(uncle.getObject(), parent.getObject());
071 }
072 return null;
073 }
074
075 /**
076 * Sister of parent is aunt.
077 * @param sister
078 * @param parent
079 */
080 @Infer
081 public Aunt infer(Sister sister, Parent parent) {
082 return sister.getObject().equals(parent.getSubject()) ? new Aunt(sister.getSubject(), parent.getObject()) : null;
083 }
084
085 /**
086 * Wife of uncle is aunt.
087 * @param sister
088 * @param parent
089 */
090 @Infer
091 public Aunt infer(Wife wife, Uncle uncle) {
092 return wife.getObject().equals(uncle.getSubject()) ? new Aunt(wife.getSubject(), uncle.getObject()) : null;
093 }
094
095 /**
096 * Brother of parent is uncle.
097 * @param sister
098 * @param parent
099 */
100 @Infer
101 public Uncle infer(Brother brother, Parent parent) {
102 return brother.getObject().equals(parent.getSubject()) ? new Uncle(brother.getSubject(), parent.getObject()) : null;
103 }
104
105 /**
106 * Husband of aunt is uncle.
107 * @param sister
108 * @param parent
109 */
110 @Infer
111 public Uncle infer(Husband husband, Aunt aunt) {
112 return husband.getObject().equals(aunt.getSubject()) ? new Uncle(husband.getSubject(), aunt.getObject()) : null;
113 }
114
115 /**
116 * Daughter of sibling is niece.
117 */
118 @Infer
119 public Niece infer(Daughter daughter, Sibling sibling) {
120 if (daughter.getObject().equals(sibling.getSubject())) {
121 return new Niece(daughter.getSubject(), sibling.getObject());
122 }
123 return null;
124 }
125
126 // TODO Implement: Spouse's niece is my niece.
127
128 /**
129 * Son of sibling is nephew.
130 */
131 @Infer
132 public Nephew infer(Son son, Sibling sibling) {
133 if (son.getObject().equals(sibling.getSubject())) {
134 return new Nephew(son.getSubject(), sibling.getObject());
135 }
136 return null;
137 }
138
139 // TODO Implement: Spouse's nephew is my nephew.
140
141 }