论坛首页 Java企业应用论坛

规则系统or脚本系统,自然语言,DSL or Java语言

浏览 15185 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-03-12  
近一段时间,公司开始应用自行开发规则系统(面向客户的)。
不过该系统没有提供冲突解决方案,因为现有的冲突解决机制,并不能比较好的解决商业上的问题,通常需要多种手段结合,导致管理上的复杂性,因此干脆不做这个功能,用人来解决(反正规则引擎也是模拟人的推理)。
但是没有冲突推理后的规则系统,看上去更像一个脚本系统。

因为目标是面向客户的,所以就不能像drools那样用java或者groovy写了。
需要用自然语言,当然局限于行业,(或许可以称为DSL,这样商业上可以吸引眼球)。
采用的机制是将java语言映射成自然语言,采用类似ilog的方式,对象就直接映射成业务上的名词,对象的方法映射成业务的动词。看起来不错,但是有问题的。
实际应用时就发现了,有时一个业务动作的用自然语言表述只要一句话。可是对应的java程序可能要好几个语句(中间用上临时变量等等)。
在现有机制下解决它唯一的办法就是加上一个方法wrap这些语句。

由于现有的机制是直接映射,导致严重依赖于现有的java对象体系,如果现有的java对象不适合直接映射时,就需要增加一个wrap方法。但是这样带来的问题很大,无法预知到底要做的什么程度才可以完备。同时,如果java对象体系没有完成,这边的自然语言就无法发展。

于是就想到了JetBrains的MPS和微软的意图编程,才理解为什么它们的设计那么复杂,因为一个真正的DSL与实际的编程语言之间的差距本身是巨大的,他们是两个不同世界的。
   发表时间:2006-03-12  
Smalltalk吧……^_^
其实你的这个需求就是我想做的一个东西。自然语言到OOP的无缝连接。
0 请登录后投票
   发表时间:2006-03-13  
哈哈,能够自然语言到编程语言无缝连接,那我们就失业了。
0 请登录后投票
   发表时间:2006-03-13  
taowen 写道
Smalltalk吧……^_^
其实你的这个需求就是我想做的一个东西。自然语言到OOP的无缝连接。


学习一下!

不过我是改良主义的,我最直接的想法是中间加一层,用虚拟对象系统来支撑现有的自然语言实现,通过反射机制来映射到实际的java对象体系!
0 请登录后投票
   发表时间:2006-03-14  
jaskell的dsl方案:
http://forum.iteye.com/bloglist.php?userid=6423
http://forum.iteye.com/viewtopic.php?t=17579&start=120

开发的这个简易规则引擎也是没有推理功能。但是已经非常象英语了:

final_discount where
  Calendar = jaskell.java.import "java.util.Calendar";
  isMonth m = m->eq cre.datepart "MONTH";
  isDay d = d->eq cre.datepart "DAY_OF_MONTH";
  purchase ctxt = ctxt.getPurchasedProducts[];
  purchased product = do {products=purchase} $
    products.contains[product];
  purchased_all products = cre.and(jaskell.prelude.map purchased products);;
  discount d = return (1-d);;
  cardtype ctxt = ctxt.getCardType[];
  gender ctxt = ctxt.getGender[];
  discountByMember type v = cardtype->eq type => discount v;
  gold_member = discountByMember "gold" 0.1;
  silver_member = discountByMember "silver" 0.05;
  platinum_member = discountByMember "platinum" 0.2;
  by_member = cre.any[platinum_member, gold_member, silver_member];
  is_female = gender->eq "female";
  is_female_day = cre.and[isMonth(Calendar.MARCH);, isDay 8];
  female_discount = cre.and[is_female, is_female_day] => discount 0.05;
  tvspeaker =  purchased_all["tv", "speaker"] => discount 0.05;
  tvspeakerdvd = purchased_all["tv", "speaker", "dvd"] => discount 0.07;
  by_purchase = cre.any[tvspeakerdvd, tvspeaker];
  final_discount = cre.fold (*); 1 [by_member, female_discount, by_purchase];
end
0 请登录后投票
   发表时间:2006-03-14  
楼主你们的UI是如何设计的?个人认为很好用的UI才是关键。比如ILOG的规则编辑器支持决策树和决策表,这两个东西并不简单,但是因为UI做得好,操作起来或者看起来很直观,很多客户就是喜欢用。
0 请登录后投票
   发表时间:2006-03-15  
用上一堆的js加div,大部分让用户点选,当然也可以输入
0 请登录后投票
   发表时间:2006-03-16  
ajoo 写道
jaskell的dsl方案:
http://forum.iteye.com/bloglist.php?userid=6423
http://forum.iteye.com/viewtopic.php?t=17579&start=120

开发的这个简易规则引擎也是没有推理功能。但是已经非常象英语了:



学习ing, google了一下,在codehaus上找到了。不过奇怪的是主页上没有连接。
0 请登录后投票
   发表时间:2006-03-16  
是没有连接。这个mini规则框架其实是从age0的那个需求例子来的。我并不确定这种需求是否常见,所以没有花力气把它放到网站上。

其实,这个东西基本上两种形式:
1。推理。语法是"rule1 => rule2"
2。顺序。语法是"do {v1=rule1} $ do {v2=rule2} $ some_logic(v1,v2)"。
要是感兴趣,我可以把最终版本贴上去。
0 请登录后投票
   发表时间:2006-03-16  
当然有兴趣啦。只不过当初讨论的时候,没有精力去看。
放上去,其他人也可以看啊。

不知道drools 3.0什么时候出来,据说支持rule编辑器了!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics