310*_*933 5 artificial-intelligence prolog inference-engine
我正在尝试了解在我正在编写的程序的人工智能编程中向后和向前链接的最佳用途。有人能够解释向后和向前链接的最理想用途吗?另外,您能举个例子吗?
我对目前对“前向链接”和“后向链接”的理解做了一些研究。这带来了很多材料。这里是 ar\xc3\xa9sum\xc3\xa9。
\n首先是一张图表,部分基于:
\nLHS代表规则的“左侧”,RHS代表规则的“右侧”。
让我们将“基于规则的系统”(即基于规则进行本地计算的系统)分为以下三组:
\nLHS => RHS重写规则重写一些工作记忆的系统。可能还有其他人。一组的特征可以在另一组中找到。一个组的系统可以部分或全部由另一组的系统实现。重叠不仅是可能的,而且是肯定的。
\n(遗憾的是,imgur 在 2020 年不接受 .svg,所以它是 .png)
\n\nRuleML(一个组织)尝试将现有的各种规则集 XML 化。他们将规则分类如下:
\n\n以上内容出现在Adrian Paschke 的《RuleML Perspective on Reaction Rule Standards》中。
\n因此,他们对“审议规则”和“反应规则”进行了区分,这是合适的。
\n“产生式规则系统”(PRS)的总体思路
\nLHS->RHS规则”和元规则,后者控制第一个规则的应用。规则可以是“逻辑的”(类似于 Prolog Horn 子句),但不一定如此!示例实现
\nDrools 支持“向后链接”(具体如何),但我不确定其他任何人是否支持,如果支持,它看起来是什么样子)
\n前向链接是 PRS“循环”的原始方法,也称为“识别-行动”循环或“数据驱动循环”,它表明了它的用途。事件-条件-动作架构是另一种常用的描述。
\n内部工作很简单:
\nLHS与工作记忆进行匹配(由于RETE 算法,每次工作记忆更新时都会发生)。RHS执行它。这一直持续到不再有LHS匹配为止。这个循环可以被视为命令式基于状态的语言的更高层次的方法。
\nRobert Kowalski 指出,“前向链接”规则实际上是两种不同用途的合并:
\n这些规则将“前取式”反复应用于工作记忆并添加推论事实。
\n例子:
\n\n\n“如果 X 是一个人,那么 X 就是凡人”
\n
用途:
\nFahiem Bacchus在《使前向链接相关》 (1998)中写道:
\n\n\n正向链接规划器有两个特别有用的属性。首先,他们维护有关潜在计划生成的中间状态的完整信息。这些信息可用于提供高效的搜索控制、域独立启发式控制以及甚至更有效的域相关控制……前向链接规划器的第二个优点是它们可以支持丰富的规划语言。例如,TLPlan 系统支持完整的 ADL 语言,包括函数和数值计算。数字和函数对于对实际规划领域的许多特征(尤其是资源和资源消耗)进行建模至关重要。
\n
上述内容在多大程度上真正适用是有争议的。您始终可以编写向后链接规划器以保留更多信息或通过搜索策略选择模块开放配置。
\n例子:
\n\n\n“如果你饿了就吃点东西”
\n
刺激是“饥饿”(可以从传感器读取)。反应是“吃点东西”(这可能意味着控制效应器)。有一个未明确的目标,即“减少饥饿”,这是通过饮食来实现的,但没有任何深思熟虑的阶段来明确该目标。
\n用途:
\nLHS可以是传感器输入,RHS可以是效应器输出。向后链接,也称为“目标导向搜索”,应用“目标缩减规则”并运行“假设驱动循环”,这表明了它的用途。
\n例子:
\n\n在以下情况下使用此功能:
\nY/N问题,直到您对对象进行了正确分类,或者同等地,直到获得诊断。作为一种编程练习,我们可以将后向链接规则也编码为前向链接规则。然而,人们应该选择最适合自己问题的表示形式和计算方法。这就是向后链接存在的原因。
\n这些是基于某些底层逻辑的系统。系统的行为可以(至少一般来说)独立于其实现进行研究。
\n请参阅此概述:斯坦福哲学百科全书:自动推理。
\n我区分了“逻辑问题建模”系统和“逻辑编程”系统。两者在 Prolog 教科书中被合并。简单的“逻辑问题”可以直接在Prolog中建模(即使用逻辑\n编程),因为该语言“足够好”并且不存在不匹配的情况。然而,在某些时候,您需要专用系统来完成您的任务,而这些系统可能与 Prolog 有很大不同。有关示例,请参见Isabelle或Coq 。
\n将我们自己限制在用于“逻辑编程”的 Prolog 系列系统中:
\nProlog 系统本身不支持前向链接。
\n如果您想要前向链接逻辑规则,您可以“在 Prolog 之上”编写自己的解释器。这是可能的,因为 Prolog 是通用编程语言。
\n这是逻辑规则前向链接的一个非常愚蠢的示例。最好定义一种特定于领域的语言和适当的数据结构:
\nadd_but_fail_if_exists(Fact,KB,[Fact|KB]) :- \\+member(Fact,KB).\n \nfwd_chain(KB,KBFinal,"forall x: man(x) -> mortal(x)") :-\n member(man(X),KB),\n add_but_fail_if_exists(mortal(X),KB,KB2),\n !,\n fwd_chain(KB2,KBFinal,_).\n\nfwd_chain(KB,KBFinal,"forall x: man(x),woman(y),(married(x,y);married(y,x)) -> needles(y,x)") :-\n member(man(X),KB),\n member(woman(Y),KB),\n (member(married(X,Y),KB);member(married(Y,X),KB)),\n add_but_fail_if_exists(needles(Y,X),KB,KB2),\n !, \n fwd_chain(KB2,KBFinal,_).\n \nfwd_chain(KB,KB,"nothing to deduce anymore").\n\nrt(KBin,KBout) :- fwd_chain(KBin,KBout,_).\nRun Code Online (Sandbox Code Playgroud)\n尝试一下:
\n?- rt([man(socrates),man(plato),woman(xanthippe),married(socrates,xanthippe)],KB).\nKB = [needles(xanthippe, socrates), mortal(plato),\n mortal(socrates), man(socrates), man(plato), \n woman(xanthippe), married(socrates, xanthippe)].\nRun Code Online (Sandbox Code Playgroud)\n人们已经研究了向 Prolog 添加高效前向链接的扩展,但它们似乎都已被放弃。我发现:
\n科瓦尔斯基写道:
\n\n\n“Zaniolo(LDL++?)和 Statelog 使用类似情境演算的表示形式和框架公理,并将产生式规则和事件-条件-动作规则简化为逻辑程序。两者都受到框架问题的困扰。”
\n
Prolog 并不是真正为“反应式规则”而设计的。已经做了一些尝试:
\n“基于逻辑的生产系统”(LPS)是最近出现的并且相当有趣:
\n它定义了一种新的语言,其中观察导致前向链接,后向链接导致行为。两个“孤岛”都通过溯因逻辑编程中的完整性约束连接起来。
\n所以你可以替换这样的反应规则:
\n\n通过类似这样的逻辑解释:
\n\n另请参阅:重写。
\n这里我就简单提一下CHR。它是一种前向链接系统,根据匹配工作存储器元素的规则连续重写工作存储器中的元素,验证逻辑保护条件,并且如果逻辑保护条件成功则移除/添加工作存储器元素。
\nCHR可以理解为线性逻辑片段的应用(参见Hariolf Betz的“A Unified Analytical Foundation for Constraint Handling Rules”)。
\nSWI Prolog 存在 CHR实现。它为 CHR 规则提供回溯功能,并且可以像任何其他 Prolog 目标一样调用 CHR 目标。
\nCHR 的用法:
\n| 归档时间: |
|
| 查看次数: |
4340 次 |
| 最近记录: |