【问题标题】:.NET Natural Language programming/aliasing/(Domain Specific Language) framework.NET 自然语言编程/别名/(领域特定语言)框架
【发布时间】:2011-02-03 21:55:51
【问题描述】:

我们目前使用 ILOG BRMS for .NET 来允许业务用户在不知道如何编程的情况下在我们的系统中创建逻辑。此规则由业务用户创建(即:它是系统的一部分,而不是规范的一部分):

definitions
  set 'the letter event' to the scheduled DelinquentLetterEvent on the invoice;
  set 'final notice possibility1' to the bill date of the invoice + 36 days;
  set 'final notice possibility2' to the time of 'the letter event' + 7 days;
  set 'final notice result' to the most future date from these values {
    'final notice possibility1', 'final notice possibility2' };
then
  in the event that 'final notice result' is not a mailing date,
    change it to the next available mailing date;
  add a new FinalNoticeEvent scheduled for 'final notice result' to the invoice;

系统在 .Net 中执行等效(此处显示伪 C#):

//variable declarations
ScheduledEvent theLetterEvent = theInvoice.GetScheduledEvent(
  KnownEventType.DelinquentLetterEvent);
DateTime noticePossibility1 = theInvoice.BillDate.AddDays(36);
DateTime noticePossibility2 = theLetterEvent.Time.AddDays(7);
DateTime[] possibilities = new DateTime[]() 
    { noticePossibility1, noticePossibility2 };
DateTime noticeResult = CustomClass.Max(possibilities);
  //actions
CustomClass2.MakeNextMailingDate(ref noticeResult);
theInvoice.AddScheduledEvent(KnownEventType.FinalNoticeEvent, noticeResult);

程序员在设计时指定用于每个类/方法/属性的文本。例如,最后一个方法的文本是:

add a new {0} scheduled for {1} to {this}

我逐渐意识到我根本不需要 BRMS。将规则匹配到断言实例的概念对于业务用户和程序员一样陌生。我们的业务用户对 SQL 脚本有些熟悉(有些人对 VBA 有所了解),因此他们对顺序执行感到满意。

我真正想要的是一种在设计时指定文本的方法(DSL),它映射到自然语言编程的类/方法/属性,最好是在 BRMS 之外。

这样的事情存在吗?这个概念的正确名称是什么?


回复:

我们已经考虑使用脚本语言来广泛满足这一需求。具体来说,他们不提供文本替换/映射到我寻求的 .NET 代码。 我想编写一个 c# 方法,然后声明一些可以调用它的合理短语。

ANTLR - 感谢您的提示。这是一个通用解析器。如果我想自己实现它,我无疑需要一个解析器。

根据定义,您发明的任何用生硬词汇集中在问题领域的人工语言都是“特定领域的语言”。

我觉得这个陈述就像我可以回答我的问题一样好。谢谢。

如果您需要完全通用的计算,您最终会得到一种典型的计算机语言。如果你能把范围缩小很多,你可能会得到一些有用的东西。

我可以将范围一直缩小到调用我已实现的方法,但问题是随着我添加更多方法,我想为这些新方法附加更多词汇。

无论我们继续使用 ILOG 还是其他东西作为语言的支持基础设施,DSL 都会不断发展。

【问题讨论】:

    标签: .net nlp dsl


    【解决方案1】:

    实际上,您无法编写一个接受真正自然语言并将其映射到工作代码的工具。没有人知道如何做到这一点。 (因此 C# 而不是英语)。

    您可以期望的最好的结果是一组生硬的短语(很像您展示的 BRML),它始终具有定义更好的优势,并且对于“业务用户”来说更难学习,因为他们不知道(想)知道该说什么开始,更不用说表现力的极限了。根据定义,您发明的任何用生硬词汇集中在问题领域的人工语言都是“特定领域的语言”。

    真正的争论是,您的语言需要包含哪些活动范围?您的“业务”用户的受教育程度如何(如果他们可以编码,我想知道他们是否被称为“业务用户”)?他们是否同意他们愿意说的范围(打赌不)。如果你需要完全通用的计算,你最终会得到一种典型的计算机语言(实际上更糟,因为你最终会在编程特性上进行沙雕,产生一个真正丑陋的婴儿)。如果你能把范围缩小很多,你可能会得到一些有用的东西。

    问题是,您能否设计出一种比您打算取代的 BRML 更好的语言来满足用户期望的功能? [我对 ILOG 的 BRML 有多好没有意见,但你必须假设他们已经尝试解决这个问题一段时间了,既然他们仍然存在,他们一定没有愚蠢的解决方案]。

    如果您有信心可以,那么您可以使用基于解析器的代码生成器工具来实现 DSL。它相当实验;如果您现在开始,您将在一年内不知道您的方法是否成功,并且可能会失败。

    良好的语言设计,无论是程序性还是 DSL,很难。

    可行的 DSL 通常发生的情况是,它们设法解决了原始问题中有趣的部分,而剩下的部分则“以某种方式”解决。处理这个问题的一种方法是发展 DSL:新语法、新语义等;成功的 DSL 确实会发生这种情况。期待你的发展,也是。另一种典型的方式是提供一些标准的转义机制(例如,某种过程调用、任意表达式……),然后有人根据需要添加额外的子例程。

    即使你得到了正确的 DSL,它也可能不会被社会接受。 [Ada 是一门非常好的语言,它被 C 和 C++ 取代,因为程序员根本不想学习它]。

    【讨论】:

      【解决方案2】:

      对于如何实现这一点,您有很多选择。让我们举几个例子:

      • 集成脚本语言。你可以例如使用 VBScript 或 Lua。您为自己的对象创建包装器并使它们可用于脚本语言。这样做的好处是已经为您实现了解析器和可执行引擎;

      • 使用 XAML。 XAML 是一种在 XML 中定义对象结构的方法。您可以使用公式的标记扩展,以便您可以使用例如分配日期BillDate="{DateFormula +1 days}";

      • 使用 ANTLR 为您自己的 DSL 定义解析器。使用 ANTLR,编写解析器相对容易。您可以从匹配的结构中创建语法中的对象。

      【讨论】:

        猜你喜欢
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多