【问题标题】:Prolog Beginner - Is This a Bad Idea?Prolog 初学者 - 这是一个坏主意吗?
【发布时间】:2011-10-10 05:36:42
【问题描述】:

我正在开发的应用程序是一种“配置器”。它是用 C# 编写的,我什至编写了一个规则引擎来配合它。这个想法是有一堆命题逻辑语句,用户可以进行选择。根据他们的选择,其他一些项目变为必需或完全不可用。

命题逻辑语句一般有以下几种形式:

A => ~X 
ABC => ~(X+Y) 
A+B => Q 
A(~(B+C)) => ~Q A <=> B

符号:

=>  -- Implication
<=> -- Material Equivalence
~   -- Not
+   -- Or
Two letters side-by-side -- And

我对 Prolog 很陌生,但它似乎可以为我处理所有“规则处理”,让我摆脱当前的规则引擎(它有效,但速度不快或易于维护)。

此外,所有可用选项都属于层次结构。例如:

Outside
   Color
      Red
      Blue
      Green
   Material
      Wood
      Metal

如果隐含第二级的项目(特征,例如颜色),则必须选择第三级的项目(选项,例如红色)。同样,如果我们知道一个特征是假的,那么它下面的所有选项也是假的。

关键是每个产品都有自己的一套规则。建立一个包含这些运算符作为谓词的知识库,然后在运行时开始为产品构建所有规则是否合理?

我认为它可能起作用的方式是建立组件、功能和选项的想法。然后设置 then 之间的关系(例如,如果特征为假,那么它的所有选项都是假的)。在运行时,添加产品的特定规则。然后将所有用户的选择传递给一个函数,检索哪些项目为真哪些项目为假作为输出。

我不知道我所问的所有含义,因为我刚刚进入 Prolog,但我正在努力避免走上糟糕的道路并在此过程中浪费大量时间。

一些可能有助于定位我正在尝试找出的问题的问题:

  1. 这听起来可行吗?
  2. 我是不是找错树了?
  3. 尝试在运行时创建所有这些规则是否有任何缺点或顾虑?
  4. 是否有更好的系统来处理这类事情,我可以将其挤入 C# 应用程序(确切地说是 Silverlight)?
  5. 我是否应该检查其他竞争系统?
  6. 您对这类事情有什么一般性建议吗?

提前感谢您的建议!

【问题讨论】:

  • 我会更改此问题的标题,使其包含短语“产品配置”或类似内容。你给自己写“关键是每个产品都有自己的一套规则”,所以我认为你对这个领域比对一般逻辑更感兴趣。

标签: prolog logic boolean-logic rule-engine inference


【解决方案1】:
  1. 当然可以,但是 Prolog 有一个学习曲线。
  2. 基于规则的推理是 Prolog 的游戏,尽管您可能必须将许多规则重写为 Horn clausesA+B =&gt; Q 是可行的(它变成 q :- a. q :- b.q :- (a;b).),但您的其他示例必须重写,包括 A =&gt; ~X
  3. 取决于您的 Prolog 编译器,特别是它是否支持动态谓词的索引。
  4. 搜索“前向检查”、“推理引擎”和“业务规则”等术语。各个社区不断为这个问题发明不同的术语。
  5. Constraint Handling Rules (CHR) 是一种逻辑编程语言,实现为 Prolog 扩展,更接近基于规则的推理/前向链接/业务规则引擎。不过,如果你想使用它,你仍然需要学习基本的 Prolog。
  6. 请记住,Prolog 是一种编程语言,而不是逻辑推理的灵丹妙药。它削减了一阶逻辑的一些角落,以保持事物的高效可计算性。这就是它只处理 Horn 子句的原因:它们可以与过程/子例程一对一地映射。

【讨论】:

    【解决方案2】:

    您还可以加入 DCG 来生成材料清单。这个想法是 大致可以用终端来表示子产品, 非终结符来定义子产品的越来越复杂的组合 直到您获得最终的可配置产品。

    以 {red, blue, green} 中的两个属性值对 Color 为例 和 {wood, metal} 中的材料。这些可以指定一个门把手,从而 并非所有组合都是可能的:

    knob(red,wood)   --> ['100101'].
    knob(red,metal)  --> ['100102'].
    knob(blue,metal) --> ['100202'].
    

    然后您可以将门定义为:

    door ... --> knob ..., panel ...
    

    有趣的是,您不会在这样的产品规范中看到任何逻辑公式, 只有事实和规则,还有很多参数传递。您可以使用 知识获取组件中的参数。通过运行未实例化 目标,您可以为属性值对派生可能的值。谓词 setof/3 将为您排序和删除重复项:

    ?- setof(Color,Material^Bill^knob(Color,Material,Bill,[]),Values).
    Value = [blue, red] 
    ?- setof(Material,Color^Bill^knob(Color,Material,Bill,[]),Values).
    Material = [metal, wood] 
    

    现在你知道了属性的范围,你可以让最终用户依次 选择一个属性和一个值。假设他采用属性颜色及其值蓝色。 属性 Material 的范围随之缩小:

    ?- setof(Material,Bill^knob(blue,Material,Bill,[]),Values).
    Material = [metal] 
    

    最后,当所有属性都被指定后,你就可以阅读文章了 子产品的数量。您可以使用它来计算价格,通过添加一些 为您提供有关货号的附加信息的事实,或生成 订购单等:

    ?- knob(blue,metal,Bill,[]).
    Bill = ['100202']
    

    最好的问候

    附: 哦,似乎是产品配置器中使用的物料清单想法 回到 Clocksin & Mellish。至少我找到了对应的 在这里评论: http://www.amzi.com/manuals/amzi/pro/ref_dcg.htm#DCGBillMaterials

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 2020-12-12
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2016-12-08
      相关资源
      最近更新 更多