一、本系统通过HTML+JavaScript语言实现,通过HTML5+CSS3设计页面的基本结构,并且加入了一些动画效果,JavaScript脚本语言则执行逻辑结构和触发事件。前台界面主要包括四部分:条件添加按钮框,综合数据库区,规则事例区,和匹配结果及分析过程区。
二、字符组主要分为三个:
(1)fact事实组,包括所有条件以及结论。
(2)rule规则数组,第0位为结果,其他位为条件,条件为空时值为0。
(3)con选定数组,包括自己选定的推理条件。
逻辑上在每个条件按钮中加入触发器按钮,当点击条件按钮后,按钮样式改变并且将该事实的值传到已经定义的字符数组con中,再次点击条件按钮代表取消该选项,则恢复原样式并且将其移出con组中。
三、当条件选择完毕后,将已经选定的con组与规则库中的规则rule组进行比较,比较的结果分为四种情况:
(1)con选定组与rule规则组完全一致,但结果并不是已知结果的七种,而是中间结果,这是弹窗提示用户是否要继续添加条件或者直接输出结果,继续添加条件后需要再次点击搜索按钮进行查找。(例如由有羽毛规则推理出来是鸟,这时会提示是否继续,继续后继续添加条件善飞,会输出最终结果信天鹰)
(2)con选定组与rule规则组完全一致,且结果为已知结果的七种,这时直接输出结果。(例如输入善飞和是鸟类,会直接输出信天鹰)
(3)con选定组与rule规则组不完全匹配但rule包含con组,这时会在提示用户该条件不完整和该规则还需要哪些条件。(例如输入是鸟类,会提示条件不完整,并给出该条件可能组成的规则:鸟类+善飞=信天鹰 鸟类+不会飞+长腿+有黑白二色=鸵鸟)
//具体每一条规则的判断函数
function match(a) {
var i = 1,
j = 0;
var sum2 = 0;
var flag = 0;
var c = new Array(6);
c[0] = 0;
//把此规则非零的值赋给新的数组C
if(used == 1) {
for(i = 1; i <= 5; i++) {
if(rule[a][i] != 0) {
sum2++;
c[i] = rule[a][i];
}
}
for(i = 0; ne[i] < 100; i++) {
//判断C数组中是否含有Con数组的值
if(c.find(function(value) {
if(value == ne[i]) {
return true;
}
})) {} else //不包含直接退出循环
return false;
}
return true;
}
for(i = 1; i <= 5; i++) {
if(rule[a][i] != 0) {
sum2++;
c[i] = rule[a][i];
}
}
//验证已选的CON函数是否符合rule规则
for(i = 0; i < count; i++) {
//判断C数组中是否含有Con数组的值
if(c.find(function(value) {
if(value == con[i]) {
return true;
}
})) {
} else //不包含直接退出循环
return false;
}
//完全匹配
if(count == sum2) {
if(rule[a][0] < 25) {
ne[0] = rule[a][0];
return 3;
}
return true;
}
//非完全匹配
else {
return 2;
}
}
//推断函数
function inference() {
var end = ""; //最后输出的结果
var flag = 0; //判断匹配类型
var sum = 0; //判断符合条件的个数
//对每一个规则进行遍历
for(var i = 1; i <= rulenum; i++) {
//完全匹配时
if(match(i) == true) {
flag = 1;
end = fact[rule[i][0]]
//把结果是怎样得来的条件输出 1+2=3
document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[rule[i][0]];
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "<br>" + '符合R' + i + "规则 ";
for(var j = 1; j <= 5; j++) {
if(rule[i][j] != 0) {
if(j == 1) {
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
} else
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
}
}
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '=' + fact[rule[i][0]] + '<br>';
break;
}
//相对匹配时
if(match(i) == 2) {
sum++;
flag = 2;
//第一次时输出
if(sum == 1)
document.getElementById('al').innerHTML = "条件不完整,根据已知条件:可能为以下公式,请继续选择条件<br>"
//把结果是怎样得来的条件输出 1+2=3
for(var j = 1; j <= 5; j++) {
if(rule[i][j] != 0) {
if(j == 1) {
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
} else
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
}
}
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '=' + fact[rule[i][0]] + '<br>';
}
if(match(i) == 3) {
used = 1;
sum++;
flag = 3;
//第一次时输出
if(sum == 1) {
document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[rule[i][0]];
document.getElementById('al').innerHTML = '暂时符合R' + i + ":";
for(var j = 1; j <= 5; j++) {
if(rule[i][j] != 0) {
if(j == 1) {
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
} else
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
}
}
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "=" + fact[rule[i][0]] + "<br>"
}
//把结果是怎样得来的条件输出 1+2=3
var pre = rule[i][0];
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "目前为" + fact[pre] + "<br>结果可能为";
for(var k = 9; k <= 15; k++) {
for(var j = 1; j <= 5; j++) {
if(pre == rule[k][j]) {
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + " " + fact[rule[k][0]];
break;
}
}
}
if(confirm('推理结果为中间结果,您是否要继续添加条件') == false) {
document.getElementById('result').innerHTML = fact[pre];
document.getElementById('result').style.top = "65px";
document.getElementById('al').innerHTML = '符合R' + i + ":";
for(var j = 1; j <= 5; j++) {
if(rule[i][j] != 0) {
if(j == 1) {
document.getElementById('al').innerHTML
= document.getElementById('al').innerHTML + "" + fact[rule[i][j]];
} else
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + '+' + fact[rule[i][j]];
}
}
document.getElementById('al').innerHTML = document.getElementById('al').innerHTML + "=" + fact[rule[i][0]] + "<br>"
};
count = 1;
break;
}
}
//不匹配
if(flag == 0) {
document.getElementById('al2').style.display = 'block';
document.getElementById('result').innerHTML = '未知动物';
}
//完全匹配
else if(flag == 1) {
document.getElementById('al').style.display = 'block';
document.getElementById('result').innerHTML = end;
document.getElementById('result').style.top = "65px";
}
//相对匹配
else if(flag == 2) {
document.getElementById('al').style.display = 'block';
} else if(flag == 3) {
document.getElementById('al').style.display = 'block';
}
return 0;
}
function clickev(id) {
//当没有这个ID值时,把id加入到CON数组中
if(used == 1) {
ne[1] = id;
document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[id];
document.getElementById(id).style.background = 'skyBlue';
document.getElementById(id).style.color = 'white';
} else {
if(con.indexOf(id) == -1) {
if(count >= 5) {
alert('最多选择五个标签');
return false;
}
document.getElementById('conclusion').innerHTML = document.getElementById('conclusion').innerHTML + " " + fact[id];
con[count] = id;
count++;
document.getElementById(id).style.background = 'skyBlue';
document.getElementById(id).style.color = 'white';
}
//存在时 则为取消操作 删除掉此ID值
else {
con.splice(con.indexOf(id), 1);
var word = document.getElementById('conclusion').innerHTML;
word = word.replace(fact[id], "");
document.getElementById('conclusion').innerHTML = word;
document.getElementById(id).style.background = 'white';
document.getElementById(id).style.color = 'black';
count--;
}
}
}
//点击搜索后的开始推断的函数
function start() {
document.getElementById('al').style.display = "none";
document.getElementById('pro').style.width = '100%';
inference();
}
//重置函数
function reset() {
//将所有东西归零
for(var id = 1; id < 25; id++) {
con.splice(con.indexOf(id), 1);
document.getElementById('al').innerHTML = "";
document.getElementById(id).style.background = 'white';
document.getElementById(id).style.color = 'black';
document.getElementById('al').style.display = 'none';
document.getElementById('al2').style.display = 'none';
document.getElementById('pro').style.width = '0%';
document.getElementById('result').innerHTML = "";
document.getElementById('result').style.top = "-250px";
document.getElementById('conclusion').innerHTML = "综合事实库:<br>";
}
count = 0;
}
(4)con选定组和rule规则组完全不匹配,这时提示用户规则库中无该规则,为未知动物。
四、当每次点击搜索匹配成功后,在提示框中都会提示该规则使用的条件和推理过程,在综合数据库中也会添加选择的条件选项。提供点击函数(clicked),重置函数(reset)以及执行推理函数(start),分别在点击条件、点击重置、点击搜索时使用。使页面的操作变得更加顺畅,选择错条件时可以再次点击该条件取消条件。