從小就有一個(gè)夢(mèng)想,將來(lái)開(kāi)發(fā)機(jī)器人,說(shuō)白了,就是人工智能。現(xiàn)在看來(lái),可喜的是,做的是軟件這行,還有點(diǎn)可行性,可惜的是,做的工作與人工智能不搭嘎,工作又太累,天天加班不說(shuō),大老遠(yuǎn)跑回家,就沒(méi)那么多時(shí)間去思考,學(xué)習(xí)人工智能了。徘徊猶豫了幾個(gè)月,一直沒(méi)有決心去寫(xiě)代碼,這不,終于決定繼續(xù)小時(shí)候的夢(mèng)想,開(kāi)始了用java實(shí)現(xiàn)人工智能的第一步了,那就是用java來(lái)分析語(yǔ)義,讓我們從頭開(kāi)始。
我的第一個(gè)Milestone很簡(jiǎn)單,用戶(hù)輸入一些語(yǔ)句作為java的知識(shí)源,然后程序自動(dòng)分析推導(dǎo)出其他的事實(shí)。Come up some examples:
~X(Man(X)>Die(X))
Man(
Socrates)
這是兩個(gè)事實(shí),程序應(yīng)該要給出Die(
Socrates),那第一階段就算完成。
~代表任意,這主要是任意的符號(hào)不好打,就用波浪線(xiàn)代替了。->用>來(lái)代替。存在用@, 否用!, 交用&,或用|,等價(jià)就用=
要完成第一階段得分兩步,第一部是分析語(yǔ)句,第二部分是根據(jù)規(guī)則來(lái)進(jìn)行推導(dǎo)。這第一部分已經(jīng)完成了。實(shí)現(xiàn)的思路:本來(lái)是要參考編譯器的,后來(lái)想想借鑒一下即可,采用了遞歸的方法。還需要測(cè)試,如果有bug,還請(qǐng)批評(píng)指正。
如果您也對(duì)于人工智能有興趣,或者想合作開(kāi)發(fā)一些賺錢(qián)的項(xiàng)目,java或者iphone的都可以,歡迎和我聯(lián)系,我的QQ627423443
第一部分代碼如下:

/** *//**
*
*/
package src.analyser;

import java.util.ArrayList;
import java.util.List;

import utils.StringUtils;


/** *//**
* @author ken
*
*/

public class BasicAnalyser
{

private List<String> predicationList = new ArrayList<String>();


public boolean isSentence(String exp)
{
exp = exp.trim();


if (StringUtils.isEmpty(exp))
{
return false;
}
exp = StringUtils.trimBracket(exp);

if (isAtomicSentence(exp))
{
return true;
}


if (exp.charAt(0) == '!')
{
return isSentence(exp.substring(1));

} else if (exp.charAt(0) == '~' || exp.charAt(0) == '@')
{
// means any or exist, must followed by VAR
String tmp = "";
int i = 0;

for (i = 1; i < exp.length(); i++)
{

if ((exp.charAt(i) >= 'A' && exp.charAt(i) <= 'Z') || exp.charAt(i) == '_')
{
tmp = tmp + exp.charAt(i);

} else
{
break;
}
}

if (i >= exp.length())
{
// means ~X
return false;

} else
{
return isSentence(exp.substring(i));
}

} else
{
// means S1 op S2
StringBuffer lastSentence = new StringBuffer();
int leftBracketNum = 0;
int rightBracketNum = 0;

for (int i = 0; i < exp.length(); i++)
{

if (isOperator(exp.charAt(i)))
{

if (leftBracketNum == rightBracketNum)
{

if (i >= exp.length())
{
return false;

} else
{

if (isSentence(lastSentence.toString()) && isSentence(exp.substring(i + 1)))
{
return true;

} else
{
return false;
}
}
}


} else
{

if (exp.charAt(i) == '(')
{
leftBracketNum++;

} else if (exp.charAt(i) == ')')
{
rightBracketNum++;
}
lastSentence = lastSentence.append(exp.charAt(i));
}
}

}
return false;

}


private boolean isOperator(char x)
{
return x == '|' || x == '&' || x == '>' || x == '=';
}


public boolean isVar(String expression)
{

expression.trim();
expression = StringUtils.trimBracket(expression);

if (StringUtils.isEmpty(expression))
{
return false;
}

if (expression.charAt(0) >= 'A' && expression.charAt(0) <= 'Z')
{

for (int i = 1; i < expression.length(); i++)
{
if ((expression.charAt(i) >= 'a' && expression.charAt(0) <= 'z') || (expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')

|| expression.charAt(i) == '_')
{
// do nothing

} else
{
return false;
}
}
return true;
}
return false;
}


public boolean isConstant(String expression)
{
expression.trim();
expression = StringUtils.trimBracket(expression);

if (StringUtils.isEmpty(expression))
{
return false;
}

if (expression.charAt(0) >= 'a' && expression.charAt(0) <= 'z')
{

for (int i = 1; i < expression.length(); i++)
{
if ((expression.charAt(i) >= 'a' && expression.charAt(0) <= 'z') || (expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')

|| expression.charAt(i) == '_')
{
// do nothing

} else
{
return false;
}
}
return true;
}
return false;
}


public boolean isLikeFormFunc(String expression, boolean upperCase)
{

if (StringUtils.isEmpty(expression))
{
return false;
}
char startLetterFrom = upperCase ? 'A' : 'a';
char startLetterTo = upperCase ? 'Z' : 'z';
expression.trim();
expression = StringUtils.trimBracket(expression);
expression = expression.replaceAll(" ", "");

if (expression.charAt(0) >= startLetterFrom && expression.charAt(0) <= startLetterTo)
{
int leftBracket = 0;
int rightBracket = 0;
StringBuffer lastString = new StringBuffer();

for (int i = 0; i < expression.length(); i++)
{

if (leftBracket == 0)
{
if (!((expression.charAt(i) >= 'A' && expression.charAt(i) <= 'Z')

|| (expression.charAt(i) >= 'a' && expression.charAt(i) <= 'z') || expression.charAt(i) == '_' || expression.charAt(i) == '('))
{
return false;// illegal
}
}

if (expression.charAt(i) == '(')
{
leftBracket++;

if (leftBracket > 1)
{
lastString.append(expression.charAt(i));
}

} else if (expression.charAt(i) == ')')
{

if (i == expression.length() - 1)
{
// last one

if (!isVar(lastString.toString()) && !isConstant(lastString.toString()) && !isFunction(lastString.toString()))
{
return false;

} else
{
return true;
}
}
rightBracket++;
lastString.append(expression.charAt(i));

} else if (expression.charAt(i) == ',')
{

if (leftBracket - rightBracket == 1)
{

if (!isVar(lastString.toString()) && !isConstant(lastString.toString()) && !isFunction(lastString.toString()))
{
return false;
}
lastString = new StringBuffer();

} else
{
lastString.append(expression.charAt(i));
}

} else
{

if (leftBracket != 0)
{
lastString.append(expression.charAt(i));
}
}
}
}
return false;
}


public boolean isAtomicSentence(String expression)
{
// Friends(father_of(david),mother_of(peter))
boolean isJustification = isLikeFormFunc(expression, true);

if (isJustification)
{
predicationList.add(expression);
}
return isJustification;
}


public boolean isFunction(String expression)
{
return isLikeFormFunc(expression, false);
}


public static void main(String[] args)
{
BasicAnalyser x = new BasicAnalyser();
String m = "Test(test(t),a,b)&Fuck(st,m)>Monday(today)";
System.out.println(x.isSentence(m));

for (int i = 0; i < x.getPredicationList().size(); i++)
{
System.out.println(x.getPredicationList().get(i));
}
}


public List<String> getPredicationList()
{
return predicationList;
}


public void setPredicationList(List<String> predicationList)
{
this.predicationList = predicationList;
}
}
