功能:
① 有若干选择动物的特征的选择列表
② 表现判断动物时,使用了哪些规则
③ 表现数据库的变化
④ 显示规则的调用次序
⑤ 显示最后结果,包含动物能被识别和不能识别
⑥ 至少检查两个例子实现正向推理和反向推理的区别
界面方面时间太短,没有设计。
在一个学长的原始代码上优化
@小菜鸡1027 点这里查看原代码
/ 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>人工智能动物专家系统</title>
<script type="text/javascript">
var themeList = ["反刍","有蹄","哺乳动物","眼向前方",
"有爪","犬齿","吃肉","会下蛋",
"不能飞","有羽毛","有蹄类","食肉类",
"鸟类","有奶","毛发","擅飞",
"黑白色","会游泳","长腿","长脖子",
"黑条纹","暗斑点","黄褐色","会飞"];
var result = {
'[15]':'哺乳动物',
'[14]':'哺乳动物',
'[10]':'鸟类',
'[8,24]':'鸟类',
'[7]':'食肉类',
'[4,5,6]':'食肉类',
'[2,3]':'有蹄类', //哺乳+眼向前方——>11 有蹄子
'[1,3]':'有蹄类',
'[3,7,22,23]':'金钱豹',
'[3,7,21,23]':'虎',
'[2,19,20,22]':'长颈鹿',
'[2,21]':'斑马',
'[9,13,17,19,20]':'鸵鸟',
'[9,13,17,18]':'企鹅',
'[13,16]':'信天翁' // 鸟类+擅飞——>信天翁 会下蛋+会飞——>鸟类
//会下蛋+会飞+擅飞——>信天翁 8,16,24 8+24->13
}
var resultObj = {
r1:[15],
r2:[14],
r3:[10],
r4:[8,24],
r5:[7],
r6:[4,5,6],
r7:[2,3],
r8:[1,3],
r9:[3,7,22,23],
r10:[3,7,21,23],
r11:[2,19,20,22],
r12:[2,21],
r13:[9,13,17,19,20],
r14:[9,13,17,18],
r15:[13,16]
}
window.onload=function(){
init();
}
// 初始化界面
function init(){
var str = "";
for(var i=0;i<themeList.length;i++){
str += (i+1)+"-"+themeList[i];
if((i+1)%3 == 0 || (i+1) == themeList.length){
str += '</br>'
}else{
str += '               '
}
}
document.getElementById('themeList').innerHTML = str;
}
// 判断一个数组是不是包含另一个数组 包含返回true
function isContained(aa, bb) {
if(!(aa instanceof Array) || !(bb instanceof Array) || ((aa.length < bb.length))) {
return false;
}
//var aaStr = aa.toString();
/*for(var i = 0; i < bb.length; i++) {
if(aaStr.indexOf(bb[i]) < 0) return false;
}*/
for (var i = 0; i < bb.length; i++) {
var flag = false;
for(var j = 0; j < aa.length; j++){
if(aa[j] == bb[i]){
flag = true;
break;
}
}
if(flag == false){
return flag;
}
}
return true;
}
// 返回value值对应的key 没有返回undefined
function findKey (obj,value, compare = (a, b) => a === b){
return Object.keys(obj).find(k => compare(obj[k], value));
}
// 正向查找
function check(){
var flag = 0;
// 把输入框内容放入arr
var arr = document.getElementById('condion').value;
// 求,的下标 如果没有就代表没有输入或只输入了一个数字
if(arr.indexOf(",") != -1){
// 默认拆分所有匹配到的内容,拆分成一个数组
arr = arr.split(",");
}
// 对输入的数据库进行输出 例子:3,7,22,23
// ---------------------------------------
var init = document.getElementById("init");
var meddia = document.getElementById("media");
var st=''; //如果不初始化 就会有undefined
// 不是单个的话就遍历
if(typeof(arr)!='string'){
//console.log(arr);
for(var s of arr){
//console.log(s);
st += themeList[s-1]+" ";
}
}
// 是单个的情况 并把当个的也变为数组
else{
st = themeList[arr-1];
arr = [arr];
}
init.innerHTML = "</br><span>用户输入的初始事实: </span>"+st;
// ---------------------------------------
// 中间的规则,动态跟新数据库 8,16,24 信天翁
// 例子:15,7,22,23 应该变成3,7,22,23 金钱豹
var haschange = 1;
var change = 0; // 如果没有可扩展的就改为0
while(haschange){
for(var i=1;i<16;i++){
var ch = 'r'+i;
var resultObjStr = resultObj[ch];
// 查找匹配的规则
// console.log(arr);
// console.log(resultObjStr);
if(isContained(arr,resultObjStr)){
// 匹配上了,将规则加入数据库 比如匹配上了resultObjStr的15毛发 那把3哺乳加入数据库
// 找到对应result的 汉字
// console.log(resultObjStr+'');// 15
// console.log(result['['+resultObjStr+']']); // 哺乳动物
// console.log(themeList.indexOf(result['['+resultObjStr+']'])+1); // 3
var adar =(themeList.indexOf(result['['+resultObjStr+']'])+1)+'';
// 输出使用的规则
//console.log(themeList[resultObjStr-1]); // 毛发
// 把resultObjStr 数字全部取出来 放入rear
var rear='';
for(var t of resultObjStr){
rear += " "+themeList[t-1];
}
change = 1;
meddia.innerHTML += "</br></br><span>使用的规则:</span>"+rear+" "+result['['+resultObjStr+']'];
// 把找到的加入数据库 15,7,22,23,3
if(adar!=0){
// 代表没直接推出动物
arr.push(adar);
}else{
var re = document.getElementById("result");
re.innerHTML = "找到的结论是:"+result['['+resultObjStr+']'];
return ;
}
haschange = 0;
}else{
// 没有扩展
change = 0;
}
// 输出动态数据库,继续循环,直到没有可扩展的规则 例子:15,7,22,23
var ST='';
if(typeof(arr)!='string'){
for(var s of arr){
ST += themeList[s-1]+" ";
}
console.log(arr);
}
if(change == 1){
// 当有扩展才输出当前动态数据库
meddia.innerHTML+="</br></br><span>当前动态数据库:"+ST+"</span>";
}
// ---------------------------------------
// break;
}
haschange = 0;
}
// ----------------------------------------
// 9,13,17,19,20
// 对15个规则进行对比 例子:15,7,22,23
for(var i=9;i<16;i++){
var ch = 'r'+i;
var resultObjStr = resultObj[ch];
if(typeof(arr)!='string'){
arr = arr.sort(sortNumber);
}
if(isContained(arr,resultObjStr)){
// 输入的规则正好对应动物 还要改进
var STR='';
for(var s of arr){
STR += themeList[s-1]+" ";
}
meddia.innerHTML +="</br></br><span>使用的规则:</span>"+STR;
//*********************
flag = 1;
console.log(result['['+resultObj[ch].toString()+']']);
document.getElementById('result').innerHTML = "找到的结论是:"+result['['+resultObj[ch].toString()+']'];
return;
}
}
if(flag == 0){
document.getElementById('result').innerHTML = '未识别到动物';
}
}
function sortNumber(a,b){
return a - b;
}
// 将charr设置为全局变量 用来接收找到的数组
var charr ='';
// 反向查找
function reversech(){
// 反向查找
var initarr='';
// 1.输入动物名 result
var arr = document.getElementById('condion').value;
initarr = arr;
var init = document.getElementById("init");
var media = document.getElementById("media");
init.innerHTML = "</br><span>用户输入的初始事实: </span>"+arr;
// 2.从result找到动物对应的数组 放入arr
arr = findKey(result,arr);
// slice()——截取部分元素返回
arr = arr.slice(1,arr.length-1);
arr = arr.split(",");
//console.log(arr); // ["3", "7", "21", "23"]
// 2.1输出虎推出的规则
var rear='';
for(var t of arr){
rear += " "+themeList[t-1];
}
media.innerHTML += "</br></br><span>使用的规则:"+initarr+" "+rear+"</span>";
// 3.数组数字减一对应的中文 themeList
var hach = 1;
for(let i=0;i<arr.length;i++){
// 4.分别对中文在result中找对应的数字加入到原数组 例子:虎
//console.log(themeList[arr[i]-1]);
arr = find(i,result,arr,hach);
// 6. 检查还有没有对应的
var newresult = result;
newresult['['+charr+']'] = '';
charr = findKey(newresult,themeList[arr[i]-1]);
console.log(charr+''); // [8,24]
// var rear1='';
// media.innerHTML += "</br></br><span>使用的规则: "+themeList[arr[i]-1]+" </span>";
if (typeof(charr) != "undefined"){
//console.log(themeList[arr[i]-1]);
find(i,newresult,arr,hach);
}
}
}
function find(i,result,arr,hach) {
charr = findKey(result,themeList[arr[i]-1]);
if (typeof(charr) != "undefined"){
//console.log(charr); // [10]
charr = charr.slice(1,charr.length-1);
//console.log(charr); // 1
charr = charr.split(",");
arr = arr.concat(charr);
// 4.1 输出扩展的规则
console.log(arr); // ["3", "7", "21", "23", "15"]
hach = 1; // 代表有扩展
}else if(i != 0){
hach = 0; // 代表没扩展
}
// 5.当有扩展输出新的数组
var ST='';
if(hach==1){
for(var s of arr){
ST += themeList[s-1]+" ";
}
media.innerHTML+="</br></br><span>当前动态数据库:"+ST+"</span>";
}
return arr;
}
</script>
</head>
<body>
<h1>知识库</h1>
<div id="themeList">
</div>
</br>
输入已知知识的序号(输入序号,序号用英文逗号隔开)
<input id="condion" type="text" value="" />
<button type="button" id="first" onclick="check()">正向查找 </button>
<button type="button" id="second" onclick="reversech()">反向查找 </button>
</br>
<div id="init">
</div>
</br>
<div id="media">
</div>
</br>
<div id="result">
</div>
</body>
</html>
运行结果截图:
金钱豹对应的规则是:3,7,22,23
信天翁对应的规则是:13,16
毛发能推出哺乳动物 15—>3
正向推导 直接得到动物:
①13,16 (对应 鸟类、擅飞)
②15 (对应 毛发)
③3,7,22,23 (对应 哺乳动物、吃肉、暗斑点、黄褐色)
需要扩展才能得到动物:
①8,16,24 (对应 会下蛋、擅飞、会飞) 8+24—>13 13+16—>信天翁
②15,7,22,23 (对应 毛发、吃肉、暗斑点、黄褐色) 15—>3 3+7+22+23—>虎
反向推到
①信天翁
②金钱豹