/// <summary>
/// Evaluates the firing strength of the Rule, the degree of confidence that the consequent of this Rule
/// must be executed.
/// </summary>
///
/// <returns>The firing strength [0..1] of the Rule.</returns>
///
public float EvaluateFiringStrength( )
{
// Stack to store the operand values
Stack <float> s = new Stack <float>( );
// Logic to calculate the firing strength
foreach (object o in rpnTokenList)
{
// if its a clause, then its value must be calculated and pushed
if (o.GetType( ) == typeof(Clause))
{
Clause c = o as Clause;
s.Push(c.Evaluate( ));
}
// if its an operator (AND / OR) the operation is performed and the result
// returns to the stack
else
{
float y = s.Pop( );
float x = 0;
// unary pops only one value
if (unaryOperators.IndexOf(o.ToString( )) < 0)
{
x = s.Pop( );
}
// operation
switch (o.ToString( ))
{
case "AND":
s.Push(normOperator.Evaluate(x, y));
break;
case "OR":
s.Push(conormOperator.Evaluate(x, y));
break;
case "NOT":
s.Push(notOperator.Evaluate(y));
break;
}
}
}
// result on the top of stack
return(s.Pop( ));
}