Prolog 复杂抽象语法树的术语顺序

Prolog 复杂抽象语法树的术语顺序,prolog,iso-prolog,Prolog,Iso Prolog,我有一个关于抽象语法树的问题。 特别是我想用一个特定的 定期订单 如何为具有以下属性的AST定义术语顺序: 对于大多数术语,顺序的行为完全相同 就像标准的内置术语顺序一样 在AST中有函子的术语 表示震源位置的位置/6。 在术语顺序中应忽略这些函子,即函子pos的所有术语应进行相等比较 是否可以使用扩展内置期限订单 “pos”的特殊情况 什么是最有效的解决方案,什么是最有效的解决方案 可读的解决方案 也许我还应该提到,我们的AST可能相当大,我刚刚测试了一个AST,它有217479个适当的函子(

我有一个关于抽象语法树的问题。
特别是我想用一个特定的 定期订单

如何为具有以下属性的AST定义术语顺序:

  • 对于大多数术语,顺序的行为完全相同 就像标准的内置术语顺序一样
  • 在AST中有函子的术语 表示震源位置的位置/6。 在术语顺序中应忽略这些函子,即函子pos的所有术语应进行相等比较
  • 是否可以使用扩展内置期限订单 “pos”的特殊情况

    什么是最有效的解决方案,什么是最有效的解决方案 可读的解决方案


    也许我还应该提到,我们的AST可能相当大,我刚刚测试了一个AST,它有217479个适当的函子(忽略空原子)我将定义一个关系
    ast\u而不带
    /2,该关系将ast
    A0
    与一个术语
    a
    相关联,该术语与
    A0
    相同,只是所有pos/6子术语都被相同的术语替换,比如原子
    t
    ,然后对这些结果术语使用标准术语顺序。我认为这是非常可读的,也是相当有效的。

    你可以看看AST上的拉链

    以下是列表的一个示例:

    如果你得到了白蚁的来源,我想你会发现一个更普遍的在树上的实现


    有什么帮助吗?

    也许我还应该提一下,我们的AST可能相当大,我刚刚对一个AST进行了基准测试,它有217479个适当的函子(忽略空原子),这意味着可以有效地复制完整的AST,很可能只需查看几个节点即可确定两个AST之间的关系。您可以很容易地将术语之间可以共享的内容写入内存。例如:没有位置的ast_(X,Y):-X=与位置不同的东西!,Y=X等。实际上AST中的每个节点都携带有关源位置的信息,因此每个节点中都有一个pos子项,共享的机会不多。有没有一种方法可以让Resembles Haskell laziness(即只计算所需的项)实现这一点?即使没有laziness(惰性):如果所有pos/6子项都被一个原子替换,结果项也会大大减少。我发现不太可能您正好处于这样一个内存边界,即您可以表示原始项,但不能表示两个明显更小的额外“副本”。好的,关于内存开销,这是可能的,但创建一个完整副本似乎仍然很慢,只需查看一小部分节点。