gpt4 book ai didi

prolog - 全局启用发生检查时,Prolog 是否需要 GC?

转载 作者:行者123 更新时间:2023-12-04 11:06:04 24 4
gpt4 key购买 nike

据我所知,sound unification , SLD 解析不应该创建循环数据结构(这是正确的吗?)
如果是这样,理论上可以以不需要垃圾收集 (GC) 的方式实现 Prolog。但话又说回来,一个人可能不会。

  • 这对于基于 WAM 的 Prolog 实现是否正确?
  • SWI-Prolog 是这样吗? (我相信它不是基于 WAM 的)当全局启用发生检查时,在 SWI-Prolog 中禁用 GC 是否安全?

  • 具体来说:
    :- set_prolog_flag(occurs_check, true).
    :- set_prolog_flag(gc, false). /* is this safe? */

    最佳答案

    循环项的创建远非 Prolog 中唯一可以创建垃圾(如垃圾收集)的操作(还值得注意的是,并非所有 Prolog 系统都提供对循环项的全面支持,但大多数都支持某种形式的垃圾收集) .
    例如,假设您的代码中有以下从数字到原子的调用序列:

    ...,
    number_codes(Number, Codes),
    atom_codes(Atom, Codes),
    ...
    在这里, Codes临时 应该被垃圾收集的列表。另一个例子,假设你调用 setof/3获取您只对前两个感兴趣的结果的有序列表:
    ...,
    setof(C, x(X), [X1, X2| _]),
    ...
    您刚刚创建了另一个临时列表。或者你忘记了 sub_atom/5并决定使用 atom_concat/3检查原子的前缀:
    ...,
    atom_concat(Prefix, _, Atom),
    ...
    第二个参数,即您不关心的原子后缀(因此是匿名变量)是 临时 你刚刚创建的原子。但并非所有 Prolog 系统都提供原子垃圾收集器,这可能会导致长时间运行的应用程序出现问题。
    但是即使你认为你已经仔细编写了代码以避免创建临时术语,Prolog 系统在运行你的代码时可能仍然会产生垃圾。 Prolog 系统为不同的目的使用不同的内存区域,并且操作可能需要在不同的内存区域之间制作内存段的临时副本,具体取决于实现。 Prolog 系统可以用一种语言编写,例如Java,最终可能会处理那些垃圾。但很可能它是用 C 或 C++ 编写的,并且内部使用了某种垃圾收集。更不用说 Prolog 系统可能会占用一大块内存来证明查询,然后在查询终止后回收该内存。

    关于prolog - 全局启用发生检查时,Prolog 是否需要 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64840715/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com