代码之家  ›  专栏  ›  技术社区  ›  MWB

当occurs检查被普遍启用时,Prolog是否需要GC?

  •  0
  • MWB  · 技术社区  · 5 年前

    sound unification ,SLD解析不应该创建循环数据结构(这是正确的吗?)

    如果是这样的话,理论上可以用一种不需要垃圾收集(GC)的方式实现Prolog。但话说回来,人们可能不会。

    • 对于基于WAM的Prolog实现,这是真的吗?

    明确地:

    :- set_prolog_flag(occurs_check, true).
    :- set_prolog_flag(gc, false). /* is this safe? */
    
    0 回复  |  直到 5 年前
        1
  •  7
  •   Paulo Moura    5 年前

    创建循环项远不是唯一可以创建的操作 垃圾 垃圾收集 )在Prolog中(同样值得注意的是,并非所有的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),
    ...
    

    第二个参数,您不关心的atom后缀(因此是匿名变量),是一个 暂时的 你刚刚创造的原子。但并非所有的Prolog系统都提供atom垃圾收集器,这可能会导致长时间运行的应用程序出现问题。

    但是,即使您认为您已经小心地编写了代码以避免创建临时术语,Prolog系统在运行您的代码时可能仍然在创建垃圾。Prolog系统为不同的目的使用不同的内存区域,并且操作可能需要在不同的内存区域之间临时复制内存段,具体取决于实现。Prolog系统可能是用一种语言编写的,例如Java,它最终可能会处理这些垃圾。但最有可能的是用C或C++编写,内部使用某种垃圾收集。更不用说Prolog系统可能会占用一大块内存来证明一个查询,然后在查询终止后回收该内存。

        2
  •  4
  •   David Tonhofer    5 年前

    某物

    考虑变量 A B 在内存中命名相同的结构(它们“命名相同的项”)。该结构从两个位置引用。假设谓词 B 定义成功或失败。Prolog处理器不能只释放该结构:它仍然是从引用的

    我不知道在任何特定的Prolog实现中实现了什么样的垃圾回收(有很多方法,有些方法比其他方法更适合Prolog。。。在一个并不完全无关的环境中,25年的Java创造了 all of these


    (循环结构仅适用于垃圾收集,因为引用计数垃圾收集算法无法释放循环结构,因为循环中的所有单元的引用计数至少为1。)

    (另外,一个IMHO,从不信任你必须调用的编程语言 free 你自己。可能有一种变化 Greenspun's tenth rule 任何足够复杂的C或Fortran程序都包含一个临时的、非正式指定的、充满错误的、缓慢的通用Lisp的实现 )任何用编程语言编写的程序 您自己包含一个临时的、非正式指定的、充满错误的、缓慢的垃圾收集算法实现。”)

    (奥托,生锈似乎需要 middle way ,将一些工作交给开发人员,但其优点是能够在变量超出范围时决定是否释放内存。但生锈不是开场白。)

    推荐文章