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.Brother;
010 import com.hammurapi.reasoning.tutorial.objectmodel.Child;
011 import com.hammurapi.reasoning.tutorial.objectmodel.Sibling;
012 import com.hammurapi.reasoning.tutorial.objectmodel.Sister;
013
014 public class SiblingRules {
015
016 /**
017 * Male sibling is brother, female sibling is sister.
018 * If A is a sibling of B then B is a sibling of A.
019 * @param sibling
020 * @return Brother or Sister.
021 */
022 @Infer({Sibling.class, Brother.class, Sister.class})
023 public Sibling infer(Sibling sibling) {
024 InferenceContext.INSTANCE.post(new Sibling(sibling.getObject(), sibling.getSubject()));
025
026 if (sibling.getSubject().isMale()) {
027 if (!(sibling instanceof Brother)) {
028 return new Brother(sibling.getSubject(), sibling.getObject());
029 }
030 } else {
031 if (!(sibling instanceof Sister)) {
032 return new Sister(sibling.getSubject(), sibling.getObject());
033 }
034 }
035 return null;
036 }
037
038 /**
039 * If two children have common parent then they are siblings.
040 * @param child
041 * @param anotherChild
042 */
043 @Condition("!arg0.getSubject().equals(arg1.getSubject()) && arg0.getObject().equals(arg1.getObject())")
044 @Infer(Sibling.class)
045 public void infer(Child child, Child anotherChild) {
046 InferenceContext.INSTANCE.post(new Sibling(child.getSubject(), anotherChild.getSubject()));
047 InferenceContext.INSTANCE.post(new Sibling(anotherChild.getSubject(), child.getSubject()));
048 }
049 }