<html>

<head><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- MyFirstUnitAd -->
<ins class="adsbygoogle"
     style="display:inline-block;width:970px;height:250px"
     data-ad-client="ca-pub-5778386704669218"
     data-ad-slot="1503492166"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>

<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Puzzle</title>
</head>

<body>

<blockquote>

<blockquote>
  <blockquote>

<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#FF0000" size="6"><b> 
 Power Logic&nbsp;<span lang="en-ca">Applications</span></b></font></p>
  </blockquote>
</blockquote>
</blockquote>
<div align="left">
  <pre><b><font color="#ff0000" size="5"><span lang="en-ca">A</span>.<span lang="en-ca">Fourth</span> Edition</font></b></pre>
</div>
<div align="left">
  <pre><b>This is actually <span lang="en-ca">Fourth( Really? I don't remember clearly and who cares?)</span> edition of <a href="logic1.htm">my logic class</a><span lang="en-ca">. And it would be</span></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>more precise to call it an application. However, there is indeed some improvement with little code added but </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>powerful function achieved!( Really? I guess I won't believe what I said myself.)</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#FF0000" size="5"><span lang="en-ca">B. The problem to solve</span>: </font></b></pre>
<div align="left">
  <pre><b>I <span lang="en-ca">made little improvement to try to solve an logic proof in COMP238 sample test in other section. The problem is</span></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>like following:</b></span></pre>
</div>
<div align="left">
  <pre><b><font color="#FF0000"><span lang="en-ca">//This is what we need to prove:
// [(p||t)&amp;&amp;(p--&gt;q)&amp;&amp;(q--&gt;r)&amp;&amp;(r--&gt;s)&amp;&amp;(s--&gt;t)] --&gt; t</span></font></b></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>p,q,r,s,t are all propositional functions. And the problem suggests a proof by contradiction. Indeed, if you</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>don't go this way, it is quite difficult, at least very tedious. </b></span></pre>
</div>
<div align="left">
  <pre><font color="#FF0000" size="5"><span lang="en-ca"><b>C. What is my approach?</b></span></font></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>I changed my major function &quot;doAnalysing()&quot; a little bit by adding a parameter of bool byContradiction to make</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>it look like &quot;void doAnalysing(bool byContradiction = false)&quot;. So, when you want to prove by contradiction, </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>simply pass a true parameter instead the default false parameter. Then in the implementation of the original </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>function, I only compare the in-passing parameter and change the last result to be false to begin an analysing</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>if it is &quot;proof by contradiction&quot;. That is it.</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>However, at first the program doesn't give correct outcome except only show that &quot;t is false and all other is</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>unknown&quot;. This is quite normal as when program pass only once in formula, it won't make full use of newly-deducted</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>result of &quot;t is false&quot;. How to make program to invoke new result as long as he gets it? Simply redo when there is</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>new discovery. That is what I did in changing the function &quot;analysing&quot; of class &quot;Analyse&quot;. I simply add a </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>recursive call of itself when &quot;readStack()&quot; return true which means the program did find new value and change it.</b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>Originally I am so clever to write this &quot;readStack()&quot; as bool-return function. Now it proves it is worth the </b></span></pre>
</div>
<div align="left">
  <pre><span lang="en-ca"><b>efforts!</b></span></pre>
</div>
</div>
<div align="left">
  <pre><font color="#FF0000" size="5"><b><span lang="en-ca">D.</span> Major function£º</b></font></pre>
</div>
<div style="WIDTH: 892px; HEIGHT: 102px" align="left">
  <pre><b>   <span lang="en-ca">A</span>. </b><font color="#0000FF">void Analyse::analysing(</font><b><font color="#FF0000">bool byContradiction</font></b><font color="#0000FF">)</font></pre>
  <pre>	Keep finding the <font color="#FF0000">&quot;result&quot;</font> type in OpRec(the stack) and call &quot;readStack&quot;, doing the analysing. Have to <font color="#FF0000">clear stack</font> for </pre>
  <pre>	next expression checking.<span lang="en-ca"> <b><font color="#FF0000">When &quot;readStack()&quot; returns true, recursively call analysing itself to restart </font></b></span></pre>
  <pre><span lang="en-ca"><font color="#FF0000"><b>	</b></font><b><font color="#FF0000">analysing job</font></b>.</span></pre>
  <pre><span lang="en-ca">(want to know more about Logic and Analyse class function? <a href="PowerLogic.htm">click here to see Power Logic.</a>)</span></pre>
  <pre><b><span lang="en-ca"><font size="5" color="#FF0000">E. Moral:</font></span></b></pre>
  <pre><span lang="en-ca">Once our great leader Chairman Mao taught us that &quot;theory cannot be tested and developed unless it is combined with practice&quot;.</span></pre>
  <pre><span lang="en-ca">So, all the program I wrote needs to be put into practice to get qualified and developed.</span>	</pre>
</div>
<pre>#include &lt;iostream&gt;

using namespace std;

const int StackLimit = 150;

enum LogicOp
{AND, OR, NOT, CONDITIONAL};

enum OpState
{Operand, Operator, Result};

enum LogicState
{Positive =1, Possible =0, Negative =-1};

bool operator == (LogicState self, LogicState dummy)
{
	return ((self - dummy) == 0);
}

//forward declaration
class Analyse;

char* OpStr[4] = {&quot; AND &quot;, &quot; OR &quot;, &quot; NOT &quot;,&quot; CONDITIONAL &quot;};

class Logic
{
private:
	static Analyse* analyse;
	static bool status;
	static int logicCount;
	char* express;
	int index;
	LogicState state;
	void catName(char*, const char*, LogicOp); 
	static Logic* temp[100];
	static int tempCount;
	static Logic* TRUE;
	static Logic* FALSE;
	bool definedStatus;
	LogicState And(LogicState self, LogicState dummy);
	LogicState Or(LogicState self, LogicState dummy);
	LogicState Not(LogicState self);
	void pushStack(const Logic* self, const Logic* pDummy, LogicOp opCode); 
	Logic* getTemp() { return temp[tempCount -1];}
protected:
	void initialize();
	bool compare(const Logic&amp; dummy);
	void uninitialize();
public:
	Analyse* getAnalyse();
	Logic(const char* newExpress, const LogicState value=Possible);
	~Logic();
	Logic();
	void prepare();
	bool getStatus() const {return definedStatus;}
	void setStatus(const bool newStatus) {definedStatus = newStatus;}
	void setExpress(const char*);
	char* getExpress() const {return express;}
	void setIndex(const int newIndex) { index = newIndex;}
	int getIndex() const {return index;}
	void setState(LogicState newState) { state = newState;}
	LogicState getState() const{ return state;}
	static const int count()  {return logicCount;}
	Logic&amp; operator&amp;&amp;(Logic&amp; dummy);
	Logic&amp; operator||(Logic&amp; dummy);
	Logic&amp; operator!();
	bool operator==(const Logic&amp; dummy);
	Logic&amp; operator&amp;&amp;(const bool value);
	Logic&amp; operator||(const bool value);	
	Logic&amp; operator=(const Logic&amp; dummy);
	Logic&amp; operator&gt;&gt;(Logic&amp; dummy);
	void doAnalysing(bool byContradiction = false); 
	
};

union UNKNOWN
{
	LogicOp operator = (LogicOp dummy);
	Logic* operator = (const Logic* dummy);
	Logic* logic;
	LogicOp op;
};

struct OpRec
{
	OpState opType;
	union UNKNOWN unknown;
};


Logic* UNKNOWN::operator =(const Logic* dummy)
{
	logic = (Logic*)dummy;
	return logic;
}

LogicOp UNKNOWN::operator = (LogicOp dummy)
{
	op = dummy;
	return op;
}

class Analyse
{
private:
	bool analyAnd(Logic* op1, Logic* op2, Logic* result);
	bool analyOr(Logic* op1, Logic* op2, Logic* result);
	bool analyConditional(Logic* op1, Logic* op2, Logic* result);
	bool analyNot(Logic* op1, Logic* result);
	static OpRec* opStack[StackLimit];	
	int top;
	void clearStack();
	LogicOp findOpCode(int index);
	bool setNewOp(Logic* dummy, LogicState newValue);
	int findPreResult(int index);
	OpRec* getTop(){ if (top&gt;0)  return opStack[top -1]; else return NULL;}
public:
	Analyse();
	~Analyse();
	void push(OpRec* newRec) {if (top&lt;StackLimit) opStack[top++] = newRec;}
	OpRec* pop() {if (top&gt;0) return opStack[--top];}
	bool readStack(int index);
	void analysing(bool byContradiction);
};

char* logicStr[3] = {&quot;True&quot;, &quot;Unknown&quot;, &quot;False&quot;};


//This is what we need to prove:
// [(p||t)&amp;&amp;(p--&gt;q)&amp;&amp;(q--&gt;r)&amp;&amp;(r--&gt;s)&amp;&amp;(s--&gt;t)] --&gt; t

const int ElementNum = 5;

enum ElementIndex {P,Q,R,S,T};

Logic element[ElementNum];

char* factStr[ElementNum] = {&quot;p&quot;,&quot;q&quot;,&quot;r&quot;,&quot;s&quot;,&quot;t&quot;};

Logic&amp; formular();



void displayResult();

void setFactStr();

int main()
{

	setFactStr();
	formular().doAnalysing(true);
	displayResult();
	return 0;
}


Logic&amp; formular()
{
	return (((element[P]||element[T])&amp;&amp;(element[P]&gt;&gt;element[Q])&amp;&amp;(
		element[Q]&gt;&gt;element[R])&amp;&amp;(element[R]&gt;&gt;element[S])&amp;&amp;(element[S]&gt;&gt;
		element[T]))&gt;&gt;element[T]);
}


void setFactStr()
{
	for (int i=0; i&lt; ElementNum; i++)
	{
		element[i].setExpress(factStr[i]);
	}
}

void displayResult()
{
	for (int i=0; i&lt; ElementNum; i++)
	{
		cout&lt;&lt;&quot;\nThe logic expression '&quot;&lt;&lt;factStr[i]&lt;&lt;&quot; 'is &quot;;
		switch (element[i].getState())
		{
		case Positive:
			cout&lt;&lt;logicStr[0];
			break;
		case Possible:
			cout&lt;&lt;logicStr[1];
			break;
		case Negative:
			cout&lt;&lt;logicStr[2];
			break;
		}
		cout&lt;&lt;&quot;\n&quot;;
	}
}




Analyse* Logic::getAnalyse()
{
	return analyse;
}


void Logic::doAnalysing(bool byContradiction)
{
	getAnalyse()-&gt;analysing(byContradiction);
}



int Analyse::findPreResult(int index)
{
	while (index &gt; 0)
	{
		index -- ;
		if  (opStack[index]-&gt;opType== Result)
			return index;
	}
	return -1;
}

void Analyse::analysing(bool byContradiction)
{
	if (getTop()-&gt;opType!= Result)
	{
		cout&lt;&lt;&quot;\nOpStack is not ended with Result:&quot;&lt;&lt;endl;
			return ;
	}
	else
	{
	
		int i = top -1;
		if (!byContradiction)
		{
			opStack[i]-&gt;unknown.logic-&gt;setState(Positive);
		}
		else
		{
			opStack[i]-&gt;unknown.logic-&gt;setState(Negative);
		}

		while (i!= -1)
		{
			if (readStack(i))
			{
				analysing(byContradiction);
			}
			//readStack(i);
			i = findPreResult(i);		
		}
	}
	clearStack();
}



LogicOp Analyse::findOpCode(int index)
{
	int i = index;
	while (opStack[i]-&gt;opType != Operator)
	{
		i--;
	}
	return opStack[i]-&gt;unknown.op;
}

bool Analyse::readStack(int index)
{	
	bool result= false;
	LogicOp opCode;
	if (opStack[index]-&gt;opType != Result )
	{
		cout&lt;&lt;&quot;Stack error!\n&quot;;
		return false;
	}
	opCode = findOpCode(index);
	switch (opCode)
	{
	case AND:
		result = analyAnd(opStack[index-3]-&gt;unknown.logic, 
			opStack[index - 1]-&gt;unknown.logic, 	opStack[index]-&gt;unknown.logic);
		break;
	case OR:
		result = analyOr(opStack[index-3]-&gt;unknown.logic, 
			opStack[index - 1]-&gt;unknown.logic, opStack[index]-&gt;unknown.logic);
		break;
	case CONDITIONAL:
		result = analyConditional(opStack[index-3]-&gt;unknown.logic, 
			opStack[index - 1]-&gt;unknown.logic, opStack[index]-&gt;unknown.logic);
		break;
	case NOT:
		result = analyNot(opStack[index -1]-&gt;unknown.logic, opStack[index]-&gt;unknown.logic);
		break;
	}
	return result;
}

bool Analyse::setNewOp(Logic* dummy, LogicState newValue)
{
	if (dummy-&gt;getState()!= newValue)
	{
		if (dummy-&gt;getState() != Possible)
		{
			cout&lt;&lt;&quot;\nYou are changing expression '&quot;&lt;&lt;dummy-&gt;getExpress()&lt;&lt;&quot;' value!&quot;;
			return false;
		}
		else
		{
			dummy-&gt;setState(newValue);
			return true;
		}
	}
	else
		return false;
}

bool Analyse::analyAnd(Logic* op1, Logic* op2, Logic* result)
{
	bool newOp = false;
	switch (result-&gt;getState())
	{
	case Positive:
		if (op1-&gt;getState()==Negative||op2-&gt;getState()==Negative)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
	
		newOp =	setNewOp(op1, Positive) || setNewOp(op2 ,Positive);
			
		break;
	case Negative:
		if (op1-&gt;getState()==Positive&amp;&amp;op2-&gt;getState() == Positive)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		if (op1-&gt;getState()==Positive)
		{
			newOp = setNewOp(op2, Negative);		
		}
		else
		{
			if (op2-&gt;getState() == Positive)
			{
				newOp = newOp || setNewOp(op1, Negative);
			}
		}
		break;
	case Possible:
		break;
	}
	return false;
}

bool Analyse::analyOr(Logic* op1, Logic* op2, Logic* result)
{
	bool newOp = false;
	switch(result-&gt;getState())
	{
	case Positive:
		if (op1-&gt;getState()==Negative &amp;&amp; op2-&gt;getState()==Negative)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		if (op1-&gt;getState() == Negative)
		{
			newOp = setNewOp(op2, Positive);
		}
		else
		{
			if (op2-&gt;getState() == Negative)
			{
				newOp = newOp || setNewOp(op1, Positive);
			}
		}
		break;
	case Negative:
		if (op1-&gt;getState()==Positive || op2-&gt;getState()== Positive)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		break;
	case Possible:
		break;
	}
	return newOp;
}


bool Analyse::analyConditional(Logic* op1, Logic* op2, Logic* result)
{
	bool newOp = false;
	switch (result-&gt;getState())
	{
	case Positive:
		if (op1-&gt;getState()==Positive&amp;&amp; op2-&gt;getState()== Negative)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		if (op1-&gt;getState()==Positive)
		{
			newOp = setNewOp(op2, Positive);
		}
		else
		{
			if (op2-&gt;getState() == Positive)
			{
				newOp = setNewOp(op1, Positive);
			}
		}
		break;
	case Negative:
		if (op1-&gt;getState() == Negative||op2-&gt;getState() == Positive)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		newOp = setNewOp(op2, Negative);
		newOp = newOp || setNewOp(op1, Positive);
		break;
	case Possible:
		break;
	}
	return newOp;
}
	



bool Analyse::analyNot(Logic* op1, Logic* result)
{
	bool newOp = false;
	
	switch (result-&gt;getState())
	{
	case Positive:
		if (op1-&gt;getState() == Positive)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		else
		{
			newOp = setNewOp(op1, Negative);
		}
		break;
	case Negative:
		if (op1-&gt;getState() == Negative)
		{
			cout&lt;&lt;&quot;\nThere is contradictive at:&quot;&lt;&lt;result-&gt;getExpress();
			return false;
		}
		else
		{
			newOp = setNewOp(op1, Positive);
		}
		break;
	case Possible:
		break;
	}
	return newOp;
}

	
Analyse* Logic::analyse = new Analyse;

OpRec* Analyse::opStack[StackLimit];

void Analyse::clearStack()
{
	for (int i =0; i&lt; top; i++)
	{
		delete opStack[i];
	}
	top = 0;
}



Analyse::Analyse()
{
	top = 0;
}

Analyse::~Analyse()
{
	clearStack();
}

LogicState Logic::And(LogicState self, LogicState dummy)
{
	if (self!=dummy)
	{
		return (LogicState)(self*dummy);
	}
	else
	{
		return self;
	}
}

LogicState Logic::Or(LogicState self, LogicState dummy)
{
	return ((self&gt;= dummy)?self: dummy);
}

LogicState Logic::Not(LogicState self)
{
	return (LogicState)(-1* self);
}



void Logic::prepare()
{
	for (int i=0; i&lt; tempCount; i++)
	{
		free(temp[i]);
	}
	tempCount =0;
}



Logic&amp; Logic::operator &gt;&gt;(Logic&amp; dummy)
{
	char buffer[256];
	catName(buffer, dummy.getExpress(), CONDITIONAL);

	temp[tempCount] = new Logic(buffer);

	temp[tempCount]-&gt;setState(Or(Not(state), dummy.getState()));
	
	tempCount++;
	pushStack(this, &amp;dummy, CONDITIONAL);

	return *temp[tempCount-1];		
}

void Logic::uninitialize()
{
	status = true;
	
	for (int i=0; i&lt; tempCount;i++)
	{
		delete temp[i];
	}
}


bool Logic::status = false;

Logic* Logic::temp[100] = {NULL}; // = new Logic;

int Logic::tempCount = 0;

Logic* Logic::FALSE = new Logic(&quot;FALSE&quot;, Negative);

Logic&amp; Logic::operator =(const Logic&amp; dummy)
{
	setExpress(dummy.getExpress());
	setState(dummy.getState());
	return *this;
}

Logic* Logic::TRUE = new Logic(&quot;TRUE&quot;, Positive);;

Logic&amp; Logic::operator &amp;&amp;(const bool value)
{
	if (value)
	{
		return (*this)&amp;&amp;(*TRUE);
	}
	else
	{
		return (*this)&amp;&amp;(*FALSE);
	}
}

Logic&amp; Logic::operator ||(const bool value)
{
	if (value)
	{
		return (*this)||(*TRUE);
	}
	else
	{
		return (*this)||(*FALSE);
	}
}

bool Logic::operator ==(const Logic&amp; dummy)
{
	return compare(dummy);
}

bool Logic::compare(const Logic&amp; dummy)
{
	return (index==dummy.getIndex());
}

void Logic::catName(char* buffer, const char* second, LogicOp opcode)
{	
	strcpy(buffer, getExpress());
	strcat(buffer, OpStr[opcode]);
	strcat(buffer, second);
}

Logic&amp; Logic::operator !()
{
	char buffer[256];
	OpRec* ptr;
	strcpy(buffer, OpStr[NOT]);
	strcat(buffer, getExpress());

	temp[tempCount] = new Logic(buffer);
	temp[tempCount]-&gt;setState(Not(getState()));

	tempCount++;
	
	ptr = new OpRec;
	ptr-&gt;opType = Operator;
	ptr-&gt;unknown = NOT;
	
	analyse-&gt;push(ptr);

	ptr = new OpRec;
	ptr-&gt;opType = Operand;
	ptr-&gt;unknown = this;

	analyse-&gt;push(ptr);

	ptr = new OpRec;
	ptr-&gt;opType = Result;
	ptr-&gt;unknown = temp[tempCount-1];

	analyse-&gt;push(ptr);

	return *temp[tempCount-1];	
}

void Logic::pushStack(const Logic* self, const Logic* pDummy, LogicOp opCode)
{
	OpRec* ptr;

	ptr = new OpRec;
	ptr-&gt;opType = Operand;
	ptr-&gt;unknown = self;
	analyse-&gt;push(ptr);

	ptr = new OpRec;
	ptr-&gt;opType = Operator;
	ptr-&gt;unknown = opCode;
	analyse-&gt;push(ptr);

	ptr = new OpRec;
	ptr-&gt;opType = Operand;
	ptr-&gt;unknown = pDummy;
	analyse-&gt;push(ptr);

	ptr = new OpRec;
	ptr-&gt;opType = Result;
	ptr-&gt;unknown = getTemp();
	analyse-&gt;push(ptr);
}
	

Logic&amp; Logic::operator &amp;&amp;(Logic&amp; dummy)
{
	char buffer[256];
	
	catName(buffer, dummy.getExpress(), AND);

	temp[tempCount] = new Logic(buffer);
	temp[tempCount]-&gt;setState(And(getState(),dummy.getState()));

	tempCount++;
	pushStack(this, &amp;dummy, AND);

	return *temp[tempCount-1];
}

Logic&amp; Logic::operator ||(Logic&amp; dummy)
{
	char buffer[256];
	catName(buffer, dummy.getExpress(), OR);
	
	temp[tempCount] = new Logic(buffer);
	temp[tempCount]-&gt;setState(Or(getState(),dummy.getState()));

	tempCount++;
	pushStack(this, &amp;dummy, OR);

	return *temp[tempCount-1];
}


int Logic::logicCount =0;

void Logic::initialize()
{
	express = NULL;
	state = Possible;
	definedStatus = false;
	setIndex(logicCount);
	logicCount++;
	status = false;
}

Logic::~Logic()
{

	if (!status)  //if you destroy one, then you destroy all!!!!!
	{
		uninitialize();
	}

	if (express!=NULL)
	{
		free(express);
	}
}

Logic::Logic(const char* newExpress, const LogicState value)
{
	initialize();
	setExpress(newExpress);
	setState(value);
}

Logic::Logic()
{
	initialize();
}

void Logic::setExpress(const char* newExpress)
{
	int i;
	i = strlen(newExpress) +1;

	if (express==NULL)
	{	
		express = (char*)malloc(i);		
	}
	else
	{
		express = (char*)realloc((void*)express, i);
	}

	strcpy(express, newExpress);

}
</pre>
<pre><a name="pic"><img border="0" src="picture/LogicApp.JPG" width="368" height="261"></a>

</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;                  
&nbsp;&nbsp;&nbsp; <a href="population2.htm">        







                       <img src="picture/back.gif" style="border: medium none" alt="back.gif (341 bytes)" width="32" height="35"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="index.htm"><img src="picture/up.gif" style="border: medium none" alt="up.gif (335 bytes)" width="35" height="32"></a>       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        
<img src="picture/next.gif" style="border: medium none" alt="next.gif (337 bytes)" width="32" height="35">          


</p>

</body>

</html>