
/*
Open Predicates:	resultPart, 
Closed Predicates:	nellFacts, domainArg, rangeArg, fwdInfer1, factOne, factZero, fwdInfer2

Partitions:
	beliefs data :	nellAllPart
	domain type constraint: domainPart
	range type constraint: rangePart
	if belief is true: factOnePart
	if belief is false: factZeroPart
	horn clause of length 1: fwdInf1Part 
	horn clause of length 2: fwdInf2Part
	horn clause of length 3: fwdInf3Part
	initial evidence set: seedPart

*/


/*************************     PREDICATES      ********************************/

	m.add predicate: "nellFacts" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID, ArgumentType.Integer, ArgumentType.UniqueID]
	m.add predicate: "domainArg" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID]
	m.add predicate: "rangeArg" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID]
	
	m.add predicate: "factOne" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID]
	m.add predicate: "factZero" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID]
	
	m.add predicate: "subsuperSet" , types: [ArgumentType.UniqueID, ArgumentType.UniqueID]	

//hornCls
	m.add predicate: "fwdInfer2" , types: [ArgumentType.String, ArgumentType.UniqueID, ArgumentType.UniqueID]
	m.add predicate: "fwdInfer3" , types: [ArgumentType.String, ArgumentType.UniqueID, ArgumentType.UniqueID, ArgumentType.UniqueID]
	m.add predicate: "fwdInfer4" , types: [ArgumentType.String, ArgumentType.UniqueID, ArgumentType.UniqueID, ArgumentType.UniqueID, ArgumentType.UniqueID]


//RESULTS PREDICATE
	m.add predicate: "inferable", types: [ArgumentType.UniqueID, ArgumentType.UniqueID]


/* function to check for HORN CLAUSE RELATIONS  */
	m.add function: "sameName" , implementation: new MyStringSimilarity()






/***************************      RULES      **********************************/


//DOMAIN ARGUMENTS - lower weight to second rule - coz tells only syntactic correctness
	m.add rule : ( inferable(A,Q) & domainArg(A,B)) >> inferable(B,Q) , weight : 0.2		//format- Relation--Range
	m.add rule : ( inferable(A,Q) & domainArg(B,A)) >> inferable(B,Q) , weight : 0.05

//RANGE ARGUMENTS - lower weight to second rule - coz tells only syntactic correctness	
	m.add rule : ( inferable(A,Q) & rangeArg(A,B)) >> inferable(B,Q) , weight : 0.2		//format- Relation--Range
	m.add rule : ( inferable(A,Q) & rangeArg(B,A)) >> inferable(B,Q) , weight : 0.05

//SUB/SUPER SET ARGUMENTS - lower weight to second rule - coz very less chances of increase
	m.add rule : ( inferable(A,Q) & subsuperSet(B,A) ) >> inferable(B,Q) , weight : 0.80		
	m.add rule : ( inferable(A,Q) & subsuperSet(A,B) ) >> inferable(B,Q) , weight : 0.20


/* Prior to suggest that by default nothing is evaluated TRUE or FALSE */
//Negation rule for threshold
//factZero  - to identify with 0
	m.add rule : ( factZero(A,Q) ) >> ~inferable(A,Q) , weight : 0.2		//format- fact--0/1
	
//factOne - to identify with 1
	m.add rule : ( factOne(A,Q) ) >> ~inferable(A,Q) , weight : 0.4
	


//Rules for inference
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,11) & inferable(B,Z) ) >> inferable(A,Z) , weight : 0.906229247
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,11) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.906229247

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,12) & inferable(B,Z) ) >> inferable(A,Z) , weight : 0.920066965
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,12) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.920066965

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,6) & inferable(B,Z) ) >> inferable(A,Z) , weight : 1.0
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,6) & inferable(A,Z) ) >> inferable(B,Z) , weight : 2.0


m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,18) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.884030317
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,18) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.884030317
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,18) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.884030317

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,19) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,19) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,19) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,3) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.569086571
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,3) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.569086571
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,3) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.569086571
	
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,5) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,5) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,5) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,10) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,10) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,10) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,24) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.429567412
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,24) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.429567412
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,24) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.429567412

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,26) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.723315585
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,26) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.723315585
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,26) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.723315585

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,27) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,27) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,27) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.881279128

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,29) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,29) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,29) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0


m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,4) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.570479799
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,4) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.570479799
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,4) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.570479799
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,4) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.570479799

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,1) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,1) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,1) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,1) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,2) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,2) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,2) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,2) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,25) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,25) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,25) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,25) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,28) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,28) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,28) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,28) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,30) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,30) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,30) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,30) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,20) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,20) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,20) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,20) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,21) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,21) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,21) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,21) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,22) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.23436838
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,22) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.23436838
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,22) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.23436838
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,22) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.23436838

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,23) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,23) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,23) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,23) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.226799053

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,13) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.750822148
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,13) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.750822148
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,13) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.750822148
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,13) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.750822148

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,14) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.94020004
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,14) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.94020004
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,14) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.94020004
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,14) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.94020004

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,15) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.872146997
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,15) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.872146997
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,15) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.872146997
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,15) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.872146997

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,16) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,16) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,16) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,16) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.893018059

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,17) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.878886863
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,17) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.878886863
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,17) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.878886863
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,17) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.878886863

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,7) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,7) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,7) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,7) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,8) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,8) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,8) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,8) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,9) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.353139693
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,9) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.353139693
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,9) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.353139693
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,9) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.353139693




m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,104) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,104) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,104) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.893018059
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,104) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.893018059

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,105) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,105) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,105) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.881279128

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,107) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,107) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,107) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.226799053

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,109) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,109) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,109) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,110) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,110) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,110) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.226799053

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,111) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,111) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,111) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.226799053
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,111) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.226799053

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,112) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,112) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,112) & inferable(A,Z) ) >> inferable(D,Z) , weight : 1.0
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,112) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,114) & inferable(B,Z) ) >> inferable(A,Z) , weight : 0.226799053
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,114) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.226799053

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,119) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,119) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,119) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,119) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.569086571

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,134) & inferable(B,Z) ) >> inferable(A,Z) , weight : 1.0
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,134) & inferable(A,Z) ) >> inferable(B,Z) , weight : 2.0

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,135) & inferable(B,Z) ) >> inferable(A,Z) , weight : 0.750822148
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,135) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.750822148

m.add rule : ( fwdInfer2(H,A,B) & sameName(H,138) & inferable(B,Z) ) >> inferable(A,Z) , weight : 1.0
m.add rule : ( fwdInfer2(H,A,B) & sameName(H,138) & inferable(A,Z) ) >> inferable(B,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,145) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.881279128
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,145) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.881279128
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,145) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.881279128
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,145) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.881279128

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,146) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,146) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,146) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.881279128

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,154) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.750822148
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,154) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.750822148
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,154) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.750822148

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,163) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,163) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.881279128
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,163) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.881279128

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,172) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.893018059
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,172) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.893018059
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,172) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.893018059

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,173) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,173) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,173) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,177) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,177) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,177) & inferable(A,Z) ) >> inferable(D,Z) , weight : 0.569086571
m.add rule : ( fwdInfer4(H,A,B,C,D) & sameName(H,177) & inferable(B,Z) & inferable(C,Z) & inferable(D,Z) ) >> inferable(A,Z) , weight : 1.569086571

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,179) & inferable(A,Z) ) >> inferable(B,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,179) & inferable(A,Z) ) >> inferable(C,Z) , weight : 1.0
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,179) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 2.0

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,181) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.750822148
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,181) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.750822148
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,181) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.750822148

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,186) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,186) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.226799053
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,186) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.226799053

m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,187) & inferable(A,Z) ) >> inferable(B,Z) , weight : 0.569086571
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,187) & inferable(A,Z) ) >> inferable(C,Z) , weight : 0.569086571
m.add rule : ( fwdInfer3(H,A,B,C) & sameName(H,187) & inferable(B,Z) & inferable(C,Z) ) >> inferable(A,Z) , weight : 1.569086571

//sum of 0 and 1 for each candidate adds to one
m.add PredicateConstraint.Functional , on : inferable


/*************************      FUNCTIONS      ********************************/


/to calculate string similarity exactly
class MyStringSimilarity implements ExternalFunction {
	
	@Override
	public int getArity() {
		return 2;
	}

	@Override
	public ArgumentType[] getArgumentTypes() {
		return [ArgumentType.String, ArgumentType.Integer].toArray();
	}
	
	@Override
	public double getValue(ReadOnlyDatabase db, GroundTerm... args) {
		return args[0].toString().equals(args[1].toString()) ? 1.0 : 0.0;
	}
	
}
