问题 Prolog初学者 - 这是一个坏主意吗?


我正在研究的应用程序是各种各样的“配置器”。它是用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之间的关系(例如,如果该功能为false,则其所有选项均为false)。在运行时,添加产品的特定规则。然后将所有用户的选择传递给函数,检索哪些项为真,哪些项为假。

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

一些问题可能有助于针对我想要找到的内容:

  1. 这听起来有效吗?
  2. 我吠叫错了树吗?
  3. 尝试在运行时创建所有这些规则是否有任何缺点或顾虑?
  4. 有没有更好的系统来支持这种事情,我可能会挤进一个C#应用程序(确切地说是Silverlight)?
  5. 我还应该检查其他竞争系统吗?
  6. 你有关于这类事情的一般建议吗?

提前感谢您的建议!


4087
2017-07-21 13:11


起源

我会改变这个问题的标题,因此它包含短语“产品配置”或其他一些。你自己写的“问题是,每个产品都有自己的一套规则”,所以我认为你对这个领域比一般的逻辑更感兴趣。 - j4n bur53


答案:


  1. 当然,但Prolog有一个学习曲线。
  2. 基于规则的推理是Prolog的游戏,尽管你可能需要重写许多规则 喇叭条款A+B => Q 是可行的(它成为 q :- a. q :- b. 要么 q :- (a;b).)但你的其他例子必须重写,包括 A => ~X
  3. 取决于您的Prolog编译器,特别是它是否支持动态谓词的索引。
  4. 搜索“前向检查”,“推理引擎”和“业务规则”等术语。各种社区不断为这个问题发明不同的术语。
  5. 约束处理规则(CHR)是一种逻辑编程语言,实现为Prolog扩展,更接近基于规则的推理/转发链/业务规则引擎。如果你想使用它,你仍然需要学习基本的Prolog。
  6. 请记住,Prolog是一个 编程语言,不是逻辑推理的银弹。它削减了一阶逻辑的一些角落,以保持有效的可计算性。这就是为什么它只处理Horn子句:它们可以与程序/子程序一对一映射。

7
2017-07-21 13:40





您也可以投入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] 

现在您知道了属性的范围,您可以连续让最终用户 选择一个属性和一个值。假设他将属性Color和其值取为蓝色。 然后,属性Material的范围会相应缩小:

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

最后,当指定了所有属性时,您可以阅读该文章 副产品的数量。您可以通过添加一些来计算价格 为您提供有关商品编号的额外信息或生成的事实 订购清单等..:

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

最好的祝福

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


4
2017-07-21 22:10