它是 Prolog 中的某种“反射”吗?

lll*_*lll 1 prolog code-translation

所以基本上我试图使用一些 Prolog 代码来模拟类似指针的行为。

在这里问了一个相关的问题,大约一个月后,我终于有时间开始了。

下面是一个简单的 C 语言示例:

int a = 1;
int* p = &a;
int b = *p;   
Run Code Online (Sandbox Code Playgroud)

我想将这段代码翻译成 Prolog,如下所示(或其他更好的策略?):

A is 1, 
assert(ref(p, a)),    <-  this can be dynamic fact gene
ref(p, TEMP),   <-  now I want to use a!!
to_lowercase(TEMP, TEMP1),  <- I don't know how to implement to_low
B is TEMP1.     <- reflection? 
Run Code Online (Sandbox Code Playgroud)

所以在上面的代码中,我很困惑

  1. 在我的理解中, after ref(p, TEMP), thenTEMP将等于"a",而且它只是一个字符串,那么我如何将它重用为变量名,听起来像是反射......?

  2. 如何实现to_lowercase函数?

我说清楚了吗?

小智 5

如果您确实决定在 Prolog 中模拟计算机,那么您应该在继续之前考虑之前问题的答案。不管怎样,这个答案对你的最终目标做出了很多假设。我猜测您正在尝试模拟一台机器,并编写一个模拟器,该模拟器采用 C 风格语言编写的源代码并执行它。

假设您有一个非常简单的处理器,具有平坦的内存空间(一些小型嵌入式微控制器就是这样)。那么你的整个内存将只是 16 位地址的一大块,假设有 1000 个:

functor(Memory, memory, 1000).
Run Code Online (Sandbox Code Playgroud)

采用上面的 C 代码,编译器可能会得出:

  • Addr1为选取一个地址a(它是一个 )int,并将值写入1该地址
  • Addr2为选取一个地址p,它是一个,并在该地址处int *写入 的地址值a
  • Addr3为选取一个地址b(它是一个),并将 in 中的值所指向的int内存中的值写入其中。p

这可以转换为您正在模拟的机器的机器代码(假设编译器已经正确选择了实际地址):

arg(Addr1, Memory, 1),     % int a = 1;
arg(Addr2, Memory, Addr1), % int *p = &a;
arg(Addr2, Memory, Tmp1),  %% put the value at p in Tmp1; this is an address
arg(Tmp1, Memory, Tmp2),   %% read the value at the address Tmp1 into Tmp2
arg(Addr3, Memory, Tmp2).  % int b = *p;
Run Code Online (Sandbox Code Playgroud)

因此,当然所有地址都应该在您的内存空间内。上面的调用有些arg/3是读,有些是写;应该清楚哪个是哪个。请注意,在这个特定的联合中,该术语的所有三个参数memory/1000仍然是自由变量。要修改已设置地址处的值,您需要相应地复制它,从而释放需要重用的地址。

在继续之前,请仔细阅读您问题的所有答案。