当前位置:文档之家› 图形计算器之人工智能

图形计算器之人工智能

图形计算器之人工智能在接触CASIO公司的图形计算器Classpad 330的三个月里,我们通过研究发现Classpad的编程功能真的很强大,简直就是一个可以随身携带的Visual Basic语言编程器,同时,也是因为一次偶然的机会,在了解到iphone4s的siri语音控制功能给人们所带来的便利之后,我便有了编一个人工智能对话程序的想法。

【探究目的】利用图形计算器的编程功能,在机器上实现一个便利的人工智能对话程序,从而对计算机算法以及相关知识有一个深入的认识。

【探究过程】说起人机智能对话,我最先想到的是这样一个简单的程序:Lbl r‘设置循环点rInputstr x,"Hello!"‘输入语句,保存至x变量If x=mThenPrint n ‘输出变量nIfendInputstr x,"next talk? ","next talk"Goto r‘前往循环点r(其中m为预设问题,n为预设回答)通过判断输入问题是否与预设问题等价,来进行回答。

有了这个基础,我便有了信心,开始扩大这个数据库的容量,而dt()这个子程序就是那个时期的产物。

可是很快,我就遇到了困难,如果要实现日常的对话,这个数据库将会变得无比巨大,因为一旦有一个字符不同,系统便会无法判别,就连大小写甚至句末的空格、句号、问号等都要加以区分,实在是很麻烦,所以我便开发了如下的筛选化归程序段:Strlwr x,x ‘将字符串x全部改成小写字母Strlen x,xl ‘测量字长保存至xl变量Chrtonum x,ui,xl ‘ui取得末位字符对应的机内码If ui=32 or ui=44 or ui=46 or ui=33 or ui=63 ‘32代表“空格”的机内码,44代表“句号”的机内码,以此类推…ThenStrleft x,xl-1,x ‘x取得左起至xl-1的字符串Ifend于是乎,当你输入“how are you ”或“how are you?”或“How are you?”时,对于机内变量x,都是同一个问题“how are you”,这样就有效地节约了数据库的空间。

然而随后,在使用的过程中,我又发现,数据库再大,也还是有无法识别的问题,所以,我便想让它具有学习的功能,程序段如下:z=0 ‘z变量起标志作用If x=mThenz=z+1Print nIfendIf x=m2……If x=m3………………‘以此类推就可以扩大数据库容量If z=0Thenlp() ‘运行学习子程序(learning part) Ifend子程序段如下:q=0 ‘q变量起标志作用If q=1Thenm1=xInputstr n1q=q+1Return ‘返回主程序IfendIf q=2Thenm2=xInputstr n2q=q+1ReturnIfendIf q=3……………‘以此类推就可以扩大数据库容量这样,它就具有了学习的功能。

此时的程序已经趋于完善,可当我通过看说明书知道了Strleft这个函数的作用之后,顿时有了新的想法——给对话程序加上“调用其他程序“的功能,程序段如下:计算:Strleft x,4,xt ‘xt取得左起第4个字符之前的字符串If at=“calc”ThenStrmid x,6,xy ‘xy取得左起第6个字符之后的字符串te=StrtoExp(xy) ‘将xy转换为表达式并计算ExptoStr te,ter ‘将te转换为字符串Print terIfend绘图:If xt=“draw”ThenStrmid x,6,xyDelVar f ‘删除变量fDefine f(x)=StrtoExp(xy) ‘定义变量f为函数f(x) ClrgraphDrawgraph f(x) ‘画出f(x)的函数图象PauseIfend调用其他自制程序:Strleft x,5,xttIf xtt=“solve”ThenFc() ‘解一元二次方程程序ifend控制程序自身:If x=“bye”or “goodbye”……ThenStop ‘程序结束IfendIf x=“pause”……If x=“clear text”……至此,程序的主体已经完成,再加上心情和体力这两项富有人性化的模块,和富有人性化的提示语,整个程序就算是完成了, 程序段大致如下:心情模块:a=Rand(1,100)Lbl ra=a-1If 75<a<100Then显示好的回答Elseif 25<a<=75Then显示一般的回答Elseif a<=25显示差的回答IfendGoto r体力模块:c=rand(1,50)Lbl rb=rand (0, 1)c=c-1If c<0ThenPrint "I am tired... "PauseInput v,"Want to talk more? (Input 1/0)"if v≠b ‘体力耗尽后,每次都有50%的几率结束程序ThenPrint "Sorry, I am really tired."Print “TALK END”StopIfendIfendGoto r【探究步骤】1.开机后,按Menu键进入主菜单,如图:2.找到Program模块,通过触摸笔单击的方式进入该模块,如图:3.单击左上角的下拉菜单,选择Variable Manager项,如图;4.单击左上角的Edit菜单,选择Create Folder项,如图:5.输入文件夹名称,单击OK,如图:6.关闭Variable Manager,Folder下拉菜单中选择新建的文件夹进入,如图:7.单击上方左起第二个图标,输入主程序名称,单击OK,如图:8.单击上方左起第一个图标,输入主程序代码如下:DispText‘显示文本框SetDecimal‘设置为十进制rand(1,100)⇒arand(1,50)⇒cInputStr x,"Hello!"print "Hello!"Lbl rrand(0,1)⇒bStrJoin "- ",x,yprint yif c≤0thenprint "I am tired... "pauseinput v,"Want to talk more? (input 1/0)" if v≠bthenprint "Sorry,I am really tired."print " TALK END "stopifendifendStrLen x,xlif xl=0thenPrint "What do you want to say?"goto rtifendChrToNum x,ui,xlif ui=32 or ui=44 or ui=46 or ui=33 or ui=63 thenstrleft x,xl-1,xIfEndStrLeft x,4,xtif xt="calc"thenStrMid x,6,xystrToExp(xy)⇒teExpT oStr te,terstrjoin "The answer is ",ter,strrprint strrgoto rtifendif xt="draw2d"thenStrMid x,8,xyDelVar fdefine f(x)=strToExp(xy) Print "I am drawing it..." DrawGraph f(x)print "Done!"pausegoto rtifendStrLeft x,5,xttif xtt="solve"thenprint "I am solving..."fc()print "Done!"ExpT oStr ua,uaExpT oStr ub,ub StrJoin "x₁=",ua,strr1 StrJoin "x₂=",ub,strr2Print strr1Print strr2goto rtifendStrLeft x,6,xtif xt="draw3d"thenStrMid x,8,xyDelVar z14define z14(x,y)=strToExp(xy)‘3D绘图Print "I am drawing it..."SelOn3D 14draw3dprint "Done!"pausegoto rtifendlp()dt()lp2()lbl rta-1⇒ainputstr x,"next talk? ","next talk"Goto r注意1:fc(),lp() , dt() , lp2()都为子程序,分别起学习数据库(输入),原始数据库,学习数据库(输出)的功能,代码中所涉及的所有语句都可以通过手动输入的方式“依样画葫芦”得到,也可以在上方的“Misc”、“I/O”、“Ctrl”菜单中找到。

注意2:计算器中赋值语句为“⇒”而不是“=”。

9.同理,新建子程序fc,dt , lp,lp2及辅助程序pp,输入代码如下:dt:if x="i do not want to say anything" or x="886" or x="goodbye" or x="byebye" or x="bye"Thenprint "So,goodbye!"print " TALK END "Message "Goodbye!"StopIfEndif a≥75 and x="how are you" or x="how're you"thenprint "I'm fine ,thank you."ElseIf 25≤a<75 and x="how are you" or x="how're you"‘心情模块的体现Thenprint "I'm just so so."1⇒kElseIf a<25 and x="how are you" or x="how're you"thenprint "I don't feel very nice..."1⇒kIfEndif x="show your data"thenprint "Here's my mood:"print aprint "Here's my power:"print c1⇒kifendif x=""thenprint "??"1⇒kIf x="hello" or x="hi"thenprint "Hi!"1⇒kifendif x="what is your name"thenprint "My name is Casio."1⇒kifendif x="pause"thenprint "Ok,I have been paused."pause1⇒kifendif x="good job" or x="how kind of you" thenprint "Thank you."print "It is my pleasure."a+2⇒aifendif x="clear text"thenprint "Ok,I will clear it..." wait 1ClrText1⇒kifendif x="clear graph"thenprint "Ok,I will clear it..." wait 1ClrGraphprint "Done!"1⇒kifendReturnfc:Input ua,"ax²+bx+c=0,a?" Input ub,"b?"Input uc,"c?"ub^2-4×ua×uc⇒udif ud>0Then(-b+√(ud))/(2ua)⇒ux (-b-√(ud))/(2ua)⇒uy message "liang jie" PrintNatural ux,"x1=" PrintNatural uy,"x2=" IfEndIf ud=0Then(-ub)/(2ua)⇒uz message "chong gen" PrintNatural uz,"x1=x2=" IfEndIf ud<0then(-ub+√(ud))/(2ua)⇒ua (-ub-√(ud))/(2ua)⇒ub message "xv gen" PrintNatural ua,"x1="PrintNatural ub,"x2=" ifendreturnlp:0⇒kif x=m1thenprint n11⇒kifendif x=m2thenprint n21⇒kifendif x=m3thenprint n31⇒kifendif x=m4thenprint n41⇒kifendif x=m5thenprint n51⇒kifendif x=m6thenprint n61⇒kifend……‘以此类推,程序便获得了100句的记忆力if x=m100thenprint n1001⇒kifendReturnLp2:if k=0thenprint "I cannot understand..."print "Please teach me..."If q=1thenx⇒m1inputstr n1,"Please teach me.The answer?" q+1⇒qReturnifendIf q=2thenx⇒m2inputstr n2,"Please teach me.The answer?" q+1⇒qReturnifendIf q=3thenx⇒m3q+1⇒qReturnifendIf q=4thenx⇒m4inputstr n4,"Please teach me.The answer?" q+1⇒qReturnifendIf q=5thenx⇒m5inputstr n5,"Please teach me.The answer?" q+1⇒qReturnIfend……‘以此类推,程序便获得了100句的记忆力If q=100thenx⇒m1001⇒q Return ifendIfEnd returnpp: "0"⇒m1 "0"⇒m2 "0"⇒m3 "0"⇒m4 "0"⇒m5 ……‘以此类推"0"⇒m96 "0"⇒m97 "0"⇒m98 "0"⇒m99 "0"⇒m100 "0"⇒n1 "0"⇒n2 "0"⇒n3"0"⇒n4"0"⇒n5……‘以此类推"0"⇒n97"0"⇒n98"0"⇒n99"0"⇒n1001⇒q0⇒a0⇒b0⇒c10.运行辅助程序pp,如图:11.运行主程序,就可以实现智能对话以及各种各样的调用功能了,如图:【探究反思&总结】1.classpad330没有数组变量功能,这是最大的遗憾。

相关主题