1

上下文是一个谓词系统:规则和事实,它们根据客户的情况共同决定支付给客户的金额。大多数规则和事实在编译时是已知的,但有关特定情况的事实仅在运行时处理支付请求时才知道。我知道如何在 Mercury 中对系统进行编程,以防所有谓词在编译时都已知(即是源代码的一部分),但我不知道如何在运行时引入谓词。是否可以编写一个函数来构造具有给定参数的谓词,然后能够将构造的谓词用作计算金额的上下文的一部分?

4

1 回答 1

0

我不确定你的问题是什么。

如果通过“使用给定参数构造谓词”,您是在询问是否可以构造一个闭包,该闭包包含对原始编译程序中谓词的引用以及在运行时构造的初始参数的值列表,那么答案是“是的,你可以做到”。

如果您的意思是您是否可以在运行时构造一个谓词,其代码不是最初编译程序的一部分,那么在 Mercury 中答案是“不,您不能这样做”。但是,可以通过以下方式解决此问题

  • 将新谓词的代码写入新的 Mercury 模块;
  • 将该模块编译为目标代码;
  • 使用动态链接使新目标文件成为现有可执行文件的一部分;和
  • 使用外部代码接口将目标语言 C 指针或其在其他语言中的等价物传输到原始代码,以供其调用。

但是,对于没有实现者对 Mercury 实现如何工作的理解的任何人,不建议使用此方法。

于 2021-02-10T14:44:30.923 回答