cdata交友软件(数字矿床模型专家系统软件的实现)

本文目录
数字矿床模型专家系统软件的实现
一、编程语言的选择
能完成数字矿床模型专家系统的软件实现的编程语言必须满足计算能力强、描述能力强、可视化能力强、兼容性和移植性强的特点。
Visual C++是Microsoft公司杰出的开发工具,满足上述特点,同时Microsoft公司的Office系列产品同时作为COM组件,与Visual C++提供了无缝连接。
Dephi是Borland公司杰出的开发工具,满足上述特点,丰富的控件操作简单,有很大的优势。
综合考虑,决定利用Visual C++作为数字矿床模型专家系统开发工具。
二、知识库数据结构
(一)地质事实数据结构
每一个地质事实是推理树上的一个结点,每个结点是类CNode的一个实例。
CNode
{
数据对象:
strNote含义:结点的中文解释。
sName含义:结点的名称;
nType含义:结点的类型。取值-1表示该结点为顶极结点或根,取值0表示该结点为分支结点或分叉,取值>1表示该结点为终端结点或叶子。
fUnderPro含义:结点的后验概率值,也就是推理过程中的修正概率值,随着推理过程在时间上的延续而不断修正直至不再变化为止。顶极结点的后验概率值是推理结果的体现。
fPrePro含义:顶极结点、分支结点的先验概率值。这是一个由领域专家给出的经验值。
fReliability含义:终端结点的可信度值,取值范围是-5至5的11个整数。这是一个用户在一定的观察下提供给系统的主观值。
IsSelected含义:结点是否被激活的标志信息。顶极结点或分支结点的先验概率值一旦发生变化,则该结点激活标志是TRUE,终端结点一旦被选中,则该结点激活标志是TRUE;否则该结点激活标志是FALSE。
基本操作:
CNode(name,type,prepro,reliability)
操作结果:构造一个名称为name,类型为type,先验概率值为prepro,可信度值为reliability的结点。
~CNode( )
初始条件:相应结点已经存在。
操作结果:销毁相应结点。
setName(name)
初始条件:相应结点已经存在。
操作结果:设置结点的名称为name。
setNote(note)
初始条件:相应结点已经存在。
操作结果:设置结点的中文解释为note。
setType(type)
初始条件:相应结点已经存在。
操作结果:设置结点的类型为type。
setPrePro(prepro)
初始条件:相应结点已经存在。
操作结果:设置结点的先验概率值为prepro。
setReliability(re)
初始条件:相应结点已经存在。
操作结果:设置结点的可信度值为re。
setUnderPro(underpro)
初始条件:相应结点已经存在。
操作结果:设置结点的后验概率值为underpro。
setStatus(selected)
初始条件:相应结点已经存在。
操作结果:设置结点的激活标志为selected。
getName( )
初始条件:相应结点已经存在。
操作结果:返回结点的名称。
getNote( )
初始条件:相应结点已经存在。
操作结果:返回结点的中文解释。
getType( )
初始条件:相应结点已经存在。
操作结果:返回结点的类型。
getPrePro( )
初始条件:相应结点已经存在。
操作结果:返回结点的先验概率值。
getReliability( )
初始条件:相应结点已经存在。
操作结果:返回结点的可信度值。
getUnderPro( )
初始条件:相应结点已经存在。
操作结果:返回结点的后验概率值。
getStatus( )
初始条件:相应结点已经存在。
操作结果:返回结点的激活状态。
}
(二)推理规则数据结构
每一条推理规则就是关联结点之间的一个二元关系。每一个二元关系是类CRule的一个实例。
CRule
{
数据对象:
ruleName含义:规则的名称。
premiseNode含义:规则的前件。
actionNode含义:规则的结论。
LS含义:规则的充分性度量值。这是一个由领域专家给出的经验值。这个值反映的是前件的出现对结论为真的影响程度,取值范围[1,+∞),这个值离1越远表示越充分。
LN含义:规则的必要性度量。这是一个由领域专家给出的经验值。这个值反映的是前件不存在时对结论为真的影响程度,取值范围(0,1],这个值离1越远表示越必要。
IsActive含义:规则的激活标志。一旦规则被使用,激活标志是 TRUE,否则是FALSE。
基本操作:
CRule( )
操作结果:构造一个规则。
~CRule( )
初始条件:相应的规则已经存在。
操作结果:销毁相应规则。
setMember(name,premise,action,Ls,Ln)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的名称为name,前件为premise,结论为action,充分性度量值为Ls,必要性度量值为Ln。
setName(name)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的名称为name。
setPremise(premise)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的前件为premise。
setAction(action)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的结论为action。
setLs(ls)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的充分性度量值为ls。
setLn(ln)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的必要性度量值为ln。
SetStatus(status)
初始条件:相应的规则已经存在。
操作结果:设置相应规则的激活标志为status。
getRuleName( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的名称。
getPremise( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的前件。
getAction( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的结论。
getLS( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的充分性度量值。
getLN( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的必要性度量值。
getStatus( )
初始条件:相应结点已经存在。
操作结果:返回相应规则的激活标志。
};
(三)主要变量
矿床模型数 int m_Mode 1 Num;
地质事实结点数 int g_iNodeNum;
地质事实结点指针 CNode*g_pNode;
每一种矿床模型推理规则数 int*m_pRule-Num;
推理规则二重指针 CRule**m_ppRule。
三、推理模型的软件实现
数字矿床模型专家系统推理流程如图6-14。
图6-14 数字矿床模型专家系统推理流程图
(一)正向推理流程
图6-15是数字矿床模型专家系统正向推理流程图。正向推理部分代码释义如下:
1.解析析取式
strPremise=m_ppRule.getPremise( );
ipor=strPremise.Find(".OR.");
if(ipor>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
qq++;
qq/=2;
num=qq;
CString*pstr=new CString;
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr=strPremise.Mid(r,p-r);
qq++;
图6-15 数字矿床模型专家系统正向推理流程图
p+=4;
r=p;
}
else
p++;
}
imax=-6.0 f;
flg=TRUE;
for(mm=0;mm<=num;mm++){
nn=0;
while(flg&&nn<m iNodeNum){
if(g_pNode.getStatus( )
g_pNode){
if(g_pNode.getReliability( )>imax){
imax=g_pNode.getReliability( );
strPremise=g_pNode.getName( );
}
flg=FALSE;
}
nn++;
}
}
deletepstr;
}
2.前件为叶子结点的推理
if(g_pNode.getType( )>=1){
ph=g_pNode.getPrePro( );
oh=computeP2O(ph);
ces=g_pNode.getReliability( );
phs=0.0 f;
if(ces>0.0){
phe=float(ls*oh/(1.0+ls*oh));
phs=float(ph+(phe-ph)*ces*0.2);
}
else{
ph_e=float(ln*oh/(1.0+ln*oh));
phs=float(ph_e+(ph-ph_e)*(ces*0.2+1.0));
}
ohs=computeP2O(phs);
if(g_pNode.getUnderPro( )==0.0)
g_pNode.setUnderPro(phs);
else
g_pNode.setUnderPro(
computeO2P(
computeP2O(
g_pNode.getUnderPro( )
)
*ohs/oh
)
);
}
3.前件为非叶子结点的推理
if(g_pNode.getType( )==0){
pe=g_pNode.getPrePro( );
pes=g_pNode.getUnderPro( );
ph=g_pNode.getPrePro( );
oh=computeP2O(ph);
phs=0.0 f;
if(pes>=pe){
phe=float(ls*oh/(1.0+ls*oh));
phs=float(ph+(phe-ph)*(pes-pe)/(1.0-pe));
}
else{
ph_e=float(ln*oh/(1.0+ln*oh));
phs=float(ph_e+(ph-ph_e)*pes/pe);
}
if(g_pNode.getUnderPro( )==0.0)
g_pNode.setUnderPro(phs);
else{
float ohs=computeP2O(phs);
g_pNode.setUnderPro(
computeO2P(
computeP2O(
g_pNode.getUnderPro( )
)
*ohs/oh
)
);
}
}
4.BP模型或典型铜矿匹配出发的推理
if(g_pNode.getName( )=="typical"){
if(g_pNode.getName( )){
float PH=g_pNode.getPrePro( );
float OH=computeP2O(PH);
float CES=5.Of;
BOOL flags=TRUE;
int ffff=0;
float LS,LN;
while(flags&&ffff<m pRuleNum){
if(m_ppRule.getName( )
&&m_ppRule.getName( )){
m_ppRule.setStatus(TRUE);
LS=m_ppRule.getLS( );
LN=m_ppRule.getLN( );
flags=FALSE;
}
ffff++;
}
float PHE=float(LS*OH/(1.0+LS*OH));
float PHS=float(PH+(PHE-PH)*CES*0.2);
float OHS=computeP2O(PHS);
if(g_pNode.getUnderPro( )==0.0){
g_pNode.setUnderPro(PHS);
}
else{
g_pNode.setUnderPro(
computeO2P(
computeP2O(
g_pNode.getUnderPro( )
)
*ohs/oh
)
);
}
}
}
(二)反向推理流程
图6-16是数字矿床模型专家系统反向推理流程图。反向推理部分代码释义如下:
1.抽取未激活的相关地质事实(含析取式)
if(l=strPremise.Find(".OR.")>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
图6-16 数字矿床模型专家系统反向推理流程图
qq++;
qq/=2;
num=qq;
CString*pstr=new CString;
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr=strPremise.Mid(r,p-r);
qq++;
p+=4;
r=p;
}
else
p++;
}
for(mm=0;mm<=num;mm++){
for(k=0;k<g iNodeNum;k++){
if(g_pNode
&&!g_pNode.getStatus( )){
g_pNode.setUnderPro(-100);
break;
}
}
}
deletepstr;}
2.抽取未激活的相关地质事实(含合取式)
if(l=strPremise.Find(".AND.")>-1){
qq=0;
for(p=0;p<strPremise.GetLength( );p++)
if(strPremise.GetAt(p)==ˊ.ˊ)
qq++;
qq/=2;
num=qq;
CString*pstr1=new CString;
qq=0;
p=0;
r=0;
strPremise+=ˊ.ˊ;
while(p<strPremise.GetLength( )){
if(strPremise.GetAt(p)==ˊ.ˊ){
pstr1=strPremise.Mid(r,p-r);
qq++;
p+=5;
r=p;
}
else
p++;
}
for(mm=0;mm<=num;mm++){
for(k=0;k<g iNodeNum;k++){
if(g_pNode
&&!g_pNode.getStatus( )){
g_pNode.setUnderPro(-100);
break;
}
}
}
deletepstr1;
}
四、解释系统的软件实现
(一)推理报告的结构
系统为每一次推理生成一份推理报告,为MS WORD文档。报告分为两个部分:正向推理报告和反向推理报告,每一部分又由用户提供证据清单和推理过程描述组成,推理过程描述采用三段论格式,并附有相关概率值、规则的充分性度量及必要性度量值。
(二)推理报告实现原理
推理报告的实现采用了基于COM的OLE自动化技术(图6-17)。
图6-17 COM组件、COM对象和COM接口之间的关系图
Windows系统平台上,一个COM组件可以是一个DLL文件,也可以是一个EXE 文件。一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。
MS OFFICE的类型库文件提供了COM功能的子集,更重要的是,类型库文件提供了类,一个类描述一个COM对象。类型库标识了自动化客户区需要调用的COM对象属性和方法的全部信息,类型库描述了属性接受或返回的值,也提供了方法能够接收参数的类型和是否必需的。类型库可以是DLL文件、EXE文件或TLB文件。每一个MS OFFICE应用程序在DLL文件中都提供多个类型库资源,带有类型库资源的DLL通常叫做对象库(.OLB文件)。其中MS WORD 97的对象库文件是Msword8.olb,MS WORD 2000的对象库文件是 Msword9.olb。
(三)生成推理报告部分代码释义
1.COM初始化
if(!AfxOleInit( ))
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
}
2.创建WORD实例初始化文档
_Application oWord;
if(!oWord.CreateDispatch("Word.Application")){
AfxMessageBox("Word failed to start!");
}
else{
oWord.SetVisible(TRUE);
Documents oDocs;
_Document oDoc;
oDocs=oWord.GetDocuments( );
oDoc=oDocs.Add(vtOptional,vtOptional,vtOptional,vtOptional);
}
3.设置文档格式、字体并输出
Selection oSelection;
Paragraphs oParagraphs;
oSelection=oWord.GetSelection( );
oParagraphs=oSelection.GetParagraphs( );
oParagraphs.SetAlignment(1);
_Font oFont;
oFont=oSelection.GetFont( );
oFont.SetSize(18);
oSelection.TypeText(StrToAdd);
InsertLines(&oSelection,1);
oParagraphs.SetAlignment(0);
oParagraphs=oSelection.GetParagraphs( );
oParagraphs.SetAlignment(3);
4.超级链接和日期
Hyperlinks oHyperlinks;
oHyperlinks=oSelection.GetHyperlinks( );
oHyperlinks.Add(oSelection.GetRange( ),
***隐藏网址***
InsertLines(&oSelection,1);
oSelection.InsertDateTime(COleVariant("dddd,mmmmdd,yyyy"),
vtFalse,vtOptional,vtOptional,vtOptional);
五、知识获取机制的软件实现
数字矿床模型专家系统知识获取机制界面如图6-18所示。相关类说明代码如下:
#include "GridCtrl.h"
classcmodifyRule:public CDialog
{
public:
int GetTypeNo(int row);
—CModifyRule( );
CString**m_ppstrCell;
CString*m_pstrColName;
图6-18 数字矿床模型专家系统知识获取机制界面图
int m_iColNum;
int*m_piTypeNum;
int m_iTypeNum;
bool ReadRule( );
void OnTitletips( );
void OnItalics( );
void OnListmode( );
CModifyRule(CWnd*pParent=NULL);
//{{AFX DATA(CModifyRule)
enum{ IDD=IDD_MODIFY_RULE};
int m_nFixCols;
int m_nFixRows;
int m_nCols;
int m_nRows;
BOOL m_bEditable;
BOOL m_bHorzLines;
BOOL m_bListMode;
BOOL m_bVertLines;
BOOL m_bSelectable;
BOOL m_bAllowColumnResize;
BOOL m_bAllowRowResize;
BOOL m_bHeaderSort;
BOOL m_bReadOnly;
BOOL m_bItalics;
BOOL m_btitleTips;
//}}AFX DATA
CGridCtrl m Grid;
CSize m OldSize;
//ClassWizard generated virtual function overrides
//{{AFX VIRTUAL(CModifyRule)
protected:
virtual void DoDataExchange(CDataExchange*pDX);
//}}AFX VIRTUAL
protected:
//{{AFX MSG(CModifyRule)
afx_msg void OnInsertRow( );
afx_msg void OnDeleteRow( );
virtual BOOL OnInitDialog( );
afx_msg void OnSize(UINT nType,int cx,int cy);
afx_msg void OnClose( );
afx_msg BOOL OnHelpInfo(HELPINFO*pHelpInfo);
//}}AFX MSG
DECLARE MESSAGE MAP( )
};
六、知识数据的组织
(一)知识库文件格式
1.结点数据文件格式
结点总数n;
结点属性数m;
结点属性1名称…结点属性m名称;
结点1属性1值…结点1属性m值;
…
结点n属性1值…结点n属性m值。
2.规则数据文件格式;
矿床类型种数n;
矿床1推理规则数m1;
…
矿床n推理规则数mn;
属性数c;
属性1名称…属性c名称;
矿床1规则1属性1值…矿床1规则1属性c值;
…
矿床1规则m1属性1值…矿床1规则m1属性c值;
…
矿床n规则1属性1值…矿床n规则1属性c值;
…
矿床n规则mn属性1值…矿床n规则mn属性c值。
七、知识库文件的安全
知识库文件加密保存,加密方式是对字符与密钥进行按位异或运算。
static void ApplyKeyToFile(FILE*in,FILE*out,unsigned char key)
{
int ch;
while((ch=getc(in))!=EOF)
putc(ch ^ key,out);
}
怎么安装deb软件
1、这里使用的ubuntu系统做演示,首先把deb文件放到一个文件夹中,例如这里的dolphin_emu文件。
2、在文件夹里右键“在终端打开”。
3、使用dpkg命令进行安装。sudo dpkg -i deb文件名
4、根据经验,通常情况下会报依赖关系的错误,可以使用以下的命令修复安装。sudo apt-get install -f
5、如果要卸载安装的应用通过“sudo dpkg -l”查看已经安装的软件,并找到自己的安装的软件名。
6、最后使用"sudo dpkg -r 软件名"进行卸载。
7、在ubuntu中我们也可以尝试直接双击打开软件中心进行安装。
能用什么软件在电脑里就能打开浏览.gsl文件吗
GSL文件是VXML语音识别中用到的一种特定格式的文件。其格式如下:
1.GSL内部定义和外部定义.
内部定义是在VXML文档中完全用《grammer》元素定义.外部定义是定义一个外部文件,并在VXML中引用.在外部GSL文档中,所有的规则必须命名.在内部GSL定义中,如果只有一个语音识别规则,可以不命名,如果有多个语音识别规则,每一个都要命名.
GSL推荐的扩展名为.gsl.解释器也识别.grammar的扩展名.如果直接在VXML文档中定义grammar,一定要用CDATA括起来,否则VXML文档无法识别.如下:
《grammar ...usage attributes...》
《![CDATA[
...grammar header...
...grammar rule definitions...
]]》
《/grammar》
外部GSL文件不应该包含CDATA部分,格式如下:
;GSL2.0
...grammar rule definitions...
2.GSL中的注释。
GSL中的注释可以出现在任何地方,注释用分号开始,分号后的内容将会被全部忽略.例如:
; this is a comment
RuleName ; this is a comment, after a non-comment
3.GSL中的保留字.
AND-n, OR-n, OP-n, KC-n, PC-n 以上是GSL的保留字,不能够将它们定义为规则的名字.n是个整数.
4.GSL的头部声明.
GSL文件可以用一个self-identifying header开始,来说明GSL grammar的版本。可以不写,要是有必须用
;GSL2.0
开头。ABNF和XML语法都限制一个grammer元素只能识别语音输入和DTMF中的一种,而不允许一个grammer同时包括语音输入和DTMF。GSL文件没有这个限制,任何的GSL语法都可以在同一个grammar元素,甚至同一个识别规则中,同时包括DTMF和语音输入。XML默认使用的是第一个public 语法规则。
5.基本规则定义.
一个语法规则,包含两个部分。
第一规则的名字,这个名字可以在别的语法规则中引用。
第二 和该规则相关的可能的话音输入。
大多数的语法规则,包括一系列的用户可能说的词语,语法规则扩展部分,一般用括起来。例如:
city
该规则的名字是city,语法规则扩展部分是可选的名字。如果用户说,南京 ,北京或呼和浩特,该语法就匹配上了。语法名称是一个字符串,用来标示这个语法规则。同一个grammar中的语法规则名称,必须不一样,但是相同的语法规则名称可以用在不同的grammar中。外部定义语法,所有的语法规则必须有名字,内部语法定义中,如果只有一个语法规则,可以没有名字,否则都必须有名字。语音规则名称大小写敏感,下面的字符都可以用在语音规则名称中。
-(连字符) _(下划线) ‘(单引号) @(at符) .(句号)
特殊的语法规则。GSL有三个预定义的规则。
《special:passthrough》
《special:roadblock》
《special:resistor》
NULL 和《special:passthrough》代表的意义一样。VOID 和《special:roadblock》代表的意义一样。定义在grammar中的语法规则,不能和他们重名。
《special:passthrough》, NULL 和用户什么没有输入匹配。你可以用下面的grammer来匹配,“北京”“上海”和没有输入。
Trigger =
《special:roadblock》, VOID 定义的语法规则将不会被匹配。如,任何输入都不会匹配下面的规则。
Trigger = (VOID 北京 上海])
《special:resistor?weight=n》 用来标示语音输入的可能性,权值n是标示输入可能性的一个浮点数(floating point number) 。weight的值低于1,将会减少该规则匹配的可能性,weight值越接近零的,规则越不容易被匹配。大于1,将会增加匹配的可能性。 使用上面三种规则,可以动态的改变规则。
6.语法规则定义的作用域。
每一个规则都有一个作用域,private 或 public.public 修饰的语法规则对外部可见,外部引用可以用名称指定一个public 语法规则。private语法规则只在 包含它的grammar中可见,而且只能被在同一个grammar中的其他的语法规则引用。 把一个语法规则标示为public的
格式为:RuleName:public ruleExpansion
没有标示为public 的就是private的语法。如果一个grammar中,没有一个语法规则标示为public,那么所有的语法规则都是public的。如果有一个标示了public ,那么其余的都是private。GSL中的根语法规则是第一个标示为public的语法规则。如果都没标示,默认是第一个。下面的例子,定义了一个public 语法规则Snapper,和两个private语法规则,SnapperType和FishColors。根语法规则是Snapper。
SnapperType
FishColors
Snapper:public (SnapperType snapper)
7.语法规则的递归。 GSL文件中可以定义直接或间接引用自身的语法规则。
; Rule that refers to itself directly
Digits
Digit
; Rule that indirectly refers to itself
NounPhrase (Noun ?PrepositionalPhrase)
PrepositionalPhrase (Preposition NounPhrase)
写此类语法时要注意,GSL不支持左递归,也就是说不能定义第一个子部分包含语法规则本身的语法规则。这是为了确保解释器不会进入无穷递归,来匹配一个语法规则。
; 合法
Digits
Digits
; 不合法
Digits
Digits
语音规则扩展部分。声音标示符(英语)应该使用小写字母,数字,-(连字符) _(下划线) ‘(单引号) @(at符) .(句号).如果使用其他的特殊符号(空格除外),必须用“”双引号括起来。下面是几条简单地规则:
1。避免缩写。例如,用usa 代替 USA ,用vxml代替 VXML。
2。展开缩写。例如,用street代替st.。用doctor代替dr.。
3。把标点拼出来。
4。把大于9的数拼出来。
DTMF标示符。
键 DTMF标示符
0 dtmf-0
1 dtmf-1
2 dtmf-2
3 dtmf-3
4 dtmf-4
5 dtmf-5
6 dtmf-6
7 dtmf-7
8 dtmf-8
9 dtmf-9
* dtmf-star
# dtmf-pound
例如:
{《emp 小王》}
用户或者说“小王”或者连续的按4973 都能正确匹配。
语法规则的引用。
引用 格式
本地语义规则 语义规则名
本地语义规则的变量 语义规则名:变量名
用URL指定根语义规则名 《grammarURI》
用URL指定语义规则 《grammarURI#RuleName》
特定规则 《special:passthrough》, NULL
《special:roadblock》, VOID
《special:resistor?weight=n》
PrimaryColors ( ?Shades )
Shades
PrimaryColors
引用和宏替换差不多。上面两个等价。本地引用有两种形式。
RuleName
RuleName:variableName
第二个将会用RuleName的返回值替换。
外部引用也有两种形式。
《grammarURI》
《grammarURI#RuleName》
; 指定外部语法为根grammar
***隐藏网址***
; 引用外部语法规则
《../fish.gram#butterflies》
语法规则的综合使用。
选择:
序列:(what is coral) // sequence of tokens
(Question Subject) // sequence of rule references
(Subject is Type) // sequence of tokens and rule references
重复:语法 行为
?expr 可选的
*expr 重复该表达式0或更多次.
+expr 重复该表达式1或更多次.
例如:
Gear =
Action =
MakeRequest = (我想Action +Gear ?(和Gear) )
下面的都是匹配项。
我想买手套.
我想买手套和围巾.
我想购买手套,围巾,裤子.
可以无限制的写下去,但是用户不可能永远地说下去,如果对结果设定范围,语音识别效果会更好。用户不可能说重复的名字。把上面的改为如下,只说1-5次。
MakeRequest = (我想Action +Gear 我想Action +Gear ? (和Gear) (和Gear) (和Gear) (和Gear) )
权值:权值可以任意设 2, 2.5, 0.8, 或.4。大于1说明该选项可能性比较大。如果没有指定,各项的可能性是一样的。
格式: grammarExpression~probability
例如:
也可以把权值加到? + * 上面,这与一般的权值不一样。格式:
语法 描述
?expr~.75 75%会说一次.
+expr~.75 不说,要是说了,75%的可能说第二次,类推。
*expr~.75 75%的可能说第一次,第一次说了,75%的可能说第二次,类推。
例如:
; the word "angel" is optional and is not very likely to occur.
?angel~0.25 fish
; the rule reference can occur 0 or more times and it is
; very likely it will occur more than once.
*Digit~.8
赋值语句。用{}括起来。
两种形式,《slotname value》 和 return (value)
需要注意的是return 只能用于子语法规则,如果是根grammar则不能包含return 语句。
slot的例子:
;GSL 2.0;
ColoredOjbect:public (Color Object)
Color [
{ 《color red》 }
{ 《color yellow》 }
{ 《color green》 }
]
Object [
{ 《object vehicle》 }
{ 《object toy》 }
{ 《object clothing》 }
]
;文件结束
这个规则可以识别"yellow shirt" 或 "canary blouse"等短语。并返回相同的语义解释;
{
color: yellow;
object: clothing;
}
Return的例子:
Flight:public [
( City:frCity ) { 《origin $frCity》 }
( City:toCity ) { 《destination $toCity》 }
]
City [
atlanta { return ("Atlanta") }
chicago { return ("Chicago") }
dallas { return ("Dallas") }
]
;文件结束
从City子项 返回一个值给 Flight。
GSL中可以定义变量,也有整型和字符串类型(我也没用过),也可以调用函数。
主要函数为:
名称 描述
add 加两数
sub 减运算
mul 乘运算
div 除运算
neg 返回相反数
strcat 连接两个字符串
sublime text 插件怎么用
1. 文件快速导航: 这是sublime上面很好用的功能之一,ctrl+p可以调出窗口,菜单上的解释是gotoanythings ,确实如其所言,调出窗口后,直接输入关键字,可以在已打开的项目文件夹中进行快速文件名导航,而且支持模糊搜索,对于不想一直鼠标点开文件夹的同学来说极为方便,并且在该窗口里加上:前缀即为行跳转(ctrl+G),加上@(ctrl+R)前缀在html里是id 关键字导航,css里是每条规则导航,js里则是每个function导航。
Sublime Text 2中文版下载
2. 命令行模式 ctrl+` 可以调出命令行模式(view-》show console),主要支持python语法等,没试用过只知 quit()可以退出 。。不过sublime的插件平台package controller可以用命令行安装.
3. Ctrl+Z 撤销 Ctrl+Y 恢复撤销
4. Ctrl+D 选词 (按住-继续选择下个相同的字符串)ctrl+F查找是一下选择本页面的全部相同的然后按键盘替换则全替换
5. ctrl+shift+F 默认是在本项目(用得最多的).也可能来文件夹里查找,与普通不同的地方是sublime允许添加多个文件夹进行查找(add directory)
6. ctrl+L 选择整行(按住-继续选择下行,即按住ctrl不放按一次L则多选一行)
7. Ctrl+Shift+K 删除整行,Ctrl+KK 从光标处删除至行尾
8. ctrl+/ 单行注释, ctrl+shift+/块注释( 注释已选择内容),sublime会自动根据语言选择注释方式
9. ctrl+Enter 光标后插入行Ctrl+Shift+Enter 光标前插入行
10. ctrl+F2可以进行增删标记,然后F2在标记之间切换,Shift+F2 上一个书签.这里不爽的是无法进行鼠标添加标记
11. 在 菜单View-syntax下可以将当前面面以指定的语言进行语法高亮,通常情况下sublime会自动进行判断选择
12. snippets 代码片段插件 ,在tools-snippets菜单下可以查看当前页面支持的snippets,可以在缩略词后加tab自动补全snippets, snippets也可以从安装插件进行扩展
13. Build编译,可以进行ruby等代码的编译,我安装了一个yui compressor后,就可以在css js页面里进行压缩,快捷键是ctrl+B, 会自动在当前目录下生成xx.min.js, xx.min.css等压缩文件
14. 在菜单Preferences 下面是各种配置文件,sublime与其他器不同的是,他不提供可视化配置,软件的配置及快捷键配置全都是存在.xml文件里手动配 置,Settings-default 是系统默认配置,最好不要改,要改动的东西存放 在Settings-User里,比如font- size等, Key-bindings是快捷键配置, color scheme是代码配色方案选择,sublime本身提供了很多很不错的配色方案
15. 在页面右下角,有快速设置tab转为spaces的菜单,可以指定页面的tab宽度,也可以将页面所有tab转为指定的spaces格数
16.其它快捷键
ctrl+(已改成我习惯的快捷键).
ctrl+up, ctrl+down可以一行一行的滚动屏幕,
pageUp pageDown一页一页翻动
ctrl+shift+a 可以HTML标签内容,每按一次逐级往上,
ctrl+shift+space可以选择js等语言里的块{内容},
Ctrl+Shift+D 复制光标所在整行,插入在该行之前
Ctrl+J 合并行(已选择需要合并的多行时)
Ctrl+KU 改为大写
Ctrl+KL 改为小写
Ctrl+M 光标跳至对应的括号(BracketHighlighter插件做得更好)
Ctrl+Shift+M 选择括号内的内容(按住-继续选择父括号)
Alt+. 闭合当前标签
Ctrl+Shift+A 选择光标位置父标签对儿
Ctrl+Shift+[ 折叠代码
Ctrl+Shift+] 展开代码
Ctrl+KT 折叠属性
Ctrl+K0 展开所有
Ctrl+U 软撤销
Ctrl+T 词互换
Tab 缩进 自动完成
Shift+Tab 去除缩进
Ctrl+Shift+↑ 与上行互换
Ctrl+Shift+↓ 与下行互换
Ctrl+K Backspace 从光标处删除至行首
17 添加智能代码块提示 Tools-》new snippet (mac机下保存后缀要为.sublime-snippet )
content:放代码必须放在CDATA里,$1代表光标位置,方便类名 tabTrigger:快捷键 scope: 响应范围 可以是 html css js文件等 description:代码描述 在输入快捷键的时候 提示框内的介绍描述文字
接下来介绍一下sublime的亮点,插件机制:(装完了所有的插件都要重启软件)
sublime插件可以通过两种方式进行插件安装,
一种直接下载所有源码放置到C:\Users\yourName\AppData\Roaming \Sublime Text 2\Packages下面,路径可以在软件菜单栏Preferences-》Browse Packages查看
一种则可以通过在线安装 package control的方式进行在线安装,package control安装见其官网,就是在控制台里运行如下一段代码,再重启即可:
***隐藏网址***
安装完即可在菜单preferences-package control下打开(这里有个快捷键ctrl+shift+p是器操作的命令集合,可以直接根据关键字索引.),在 package control下 Install Package是安装插件,选择后会连网获取插件列表,disabled package 是禁用某插件,enabled package 启用插件,remove package 移除插件,list package列出插件列表。
下面介绍几个我觉得比较有用的插件,及它的功用吧(安装方法直接package control install 在线搜索安装):
1. SVN :生成后右键点击文件或文件夹(这个要钱,如果是windows的话用TorstoiseSVN,这个要先预装TorstoiseSVN)
2. BracketHighlighter :该插件提供配对标签,或大括号或字符引号的配对高亮显示,算是对系统高亮的加强吧。
3. SublimeTmpl :
自定义新建文件.默认已经添加了html、css、js等常见类型的面板,按ctrl+alt+h/ctrl+alt+c/ctrl+alt+j可新建这3钟类型的文件,快捷键在这里\Packages\SublimeTmpl\Default (Windows).sublime-keymap, 模板文件在这里\Packages\SublimeTmpl\templates,可修改。
4. ctags :
***隐藏网址***
5. sublimecodeintel :
代码提示。 sublime默认的代码提示只能提示系统函数,用户自己创建的函数、类不能提示。 如果想要提示自己建立的函数。 可以安装sublimecodeintel插件。(要多输几个字符且大小写敏感才显示,有时不灵) sublimecodeintel 安装后需要配置,文件:插件目录/.codeintel/config 中 增加
"PHP": {
"php": ’D:\SaeServer\php\php.exe’,
"phpExtraPaths": ,
"phpConfigFile": ’D:\SaeServer\apache\php.ini’
},
配置了php执行文件的地址, php的配置文件地址, phpExtraPaths 是额外需要代码提示的类库,除了当前项目下的PHP代码可以提示外 phpExtraPaths中定义的目录下的PHP代码也能提示。安装sublimecodeintel后, 按alt+鼠标左键也能和ctags一样跳转到函数声明的地方。 但是如果有两个文件声明了同样名称的函数, sublimecodeintel只会跳转到第一个找到的函数, 而ctags会让你选择要跳转到哪个文件。所以我们一般还是用ctags
6. Sublimelint (还有一款SublimeLinter应该差不多)
一个支持lint语法的插件,可以高亮linter认为有错误的代码行,也支持高亮一些特别的注释,比如“TODO”它需要一些类库支持比如php的话要 PHP - syntax checking via "php -l" .要把php加到环境变量中即可.在命令行中执行下面语句如果能正常工作即可因为装php的时候已经装了这个库支持所以只要把php加到环境变量即可
The syntax for checking is like this, where the -l flag is a lower case L:
1 php -l filename
If the syntax in the file is correct you will see this:
1 No syntax errors detected in test.php
If there are errors then theses will be listed as in the following example output:
1 Parse error: syntax error, unexpected T_STRING in test.php on line 5
2 2Errors parsing test.php
7. SFTP 该插件提供ftp服务器管理,用来管理自己的空间很不错,通过配置来操作.安装完后重启软件后在左文件夹右键单击 选择Map to Remote...即可会在文件夹下生成sftp-config.json配置即可,用的时候跟SVN一样右键就可以
8. PHPTity:php代码自动排序.装完了重启后ctrl+alt+t
9. DocBlockr :该插件提供文件注释,方便后期根据注释生成API文档,输入 “/**” + enter调出 (在function的上面一行才有效果)
10. GBK Encoding Support: sublime本身不支持GBK,根据国情,装下这个插件就可以支持GBK了,同时也提供GBK与UTF之间转换
11. jquery 提供jquery的一些snippets片段 ,方便直接调用
12. zenCoding 大名鼎鼎的zencoding就不用多解释, 调用方式两种,一种是ctrl+alt+enter, 一种是输入完标签直接tab。
13. html5 该插件提供许多 html5相关的标签等snippets,也非常实用。
14. prefixr 提供CSS3属性的浏览器前缀自动填充像-webkit- -moz- -o- -m-, 快捷键:ctrl+alt+x
15. SCSS 支持scss的语法高亮,里面附带了好多CSS Snippet,无论现用或者改造成,都可节省不少时间。
16. JS Minifer 提供js压缩功能,基于GG的closure complier,快捷键:ctrl+alt+M
17. js Format 提供JS格式化功能,快捷键 ctrl+alt+F,会根据
18. yui compressor 这个大家都知道yui的压缩工具,可以压缩CSS JS,直接CTRL+B,即可(需要安装配置了jdk之后才可用)
19. sublime v8 该插件提供jshint 及 v8引擎的js解析器console,jshint是JS语法校验器,较严格, v8则跟chrome里控制台一样。
20. ClipboardHistory: 该插件提供多剪贴板支持,你就可以同时保存多个剪贴板里的内容了,ctrl+alt+v快捷键调出

更多文章:
dreamweaver网页制作div(怎样在DreamWeaver中插入DIV标签进行布局)
2026年9月11日 15:10









