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)
所以在上面的代码中,我很困惑
在我的理解中, after ref(p, TEMP), thenTEMP将等于"a",而且它只是一个字符串,那么我如何将它重用为变量名,听起来像是反射......?
如何实现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 *写入 的地址值aAddr3为选取一个地址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仍然是自由变量。要修改已设置地址处的值,您需要相应地复制它,从而释放需要重用的地址。
在继续之前,请仔细阅读您问题的所有答案。