【问题标题】:Memoizing goals in Prolog在 Prolog 中记忆目标
【发布时间】:2016-10-08 08:29:35
【问题描述】:

Prolog 是否可以记忆计算的目标?

我的意思是说 Prolog 不应该重新计算之前计算的目标。

因此,例如,对我来说相同的计算是:

goal([first, one], he, she, var(cat, 5)).
goal([first, one], he, she, var(cat, 5)).

但不是

goal([first, one], he, she, var(cat, 6)).

因此,事实上,必须可以统一这些目标。

【问题讨论】:

    标签: prolog memoization


    【解决方案1】:

    许多 Prolog 系统提供了隐式记录此类结果的能力。这称为制表;有关如何启用它,请参阅 Prolog 系统的文档。

    Prolog 的一个好处是,您可以轻松地自己构建一个更简单(但功能更弱)的表变体,例如使用 assertz/1 来存储和加载计算结果。

    一个非常简单的实现可能类似于:

    :- 动态备忘录_/1。 备忘录(目标):- (备忘录_(目标)->真 ;目标, 断言(备忘录_(目标)) )。

    买者自保...

    这当然不是成熟的表格能给你的。

    【讨论】:

    • 出现问题是因为我必须使用递归子目标计算目标。每个子目标都有一个列表,取决于它是否失败。从这个意义上说,这个列表应该是全局的,如果一个子目标在那里附加一些东西,另一个子目标会看到它。但问题在于回溯——它会撤销一切。如何处理?
    • 一如既往:您将需要推理的列表作为参数传递给所有需要它的谓词。是的,回溯会撤消所有绑定,这就是重点。
    • 好的,但是当我想通过回溯保留一个列表的情况下呢?我知道回溯是 Prolog 中的基础/关键点,但是如何处理这种情况?
    • 为什么要这样做?即,为什么要在要保留数据时使用回溯?在您的情况下,一个简单的解决方案可能是简单地回溯,或者仅在辅助谓词中这样做。
    • @Gilgamesz 你能创建一个简单的例子来说明你正在尝试或想要做什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多