我是prolog的新手。我已经了解到,虽然它是一种声明性语言,prolog可以用作通用编程语言,就像C一样。所以,无论你在C中解决什么问题,你都可以在prolog中解决,即使它运行 - 时间可能不会那么好。由于prolog中没有指针(据我所知),我想知道我是否可以在prolog中为以下用C编写的代码编写一个等效的程序: -
#include <stdio.h>
int main()
{
int a = 5;
int *p;
p = &a;
printf("The address of a is %d.", p);
return 0;
}
答案 0 :(得分:3)
你正试图用螺丝刀钉一个钉子,用一个流行的比喻。 Prolog不是C,解决Prolog中的问题与在C中解决它们有根本的不同。
打印变量的值很容易,例如:
main :-
X = 5,
io:format("X = ~w~n", [X]).
但你无法在C中获得X的地址。你为什么要这样做?由于Prolog自动垃圾收集,下次地址可能会有所不同。
如果您想学习Prolog,请忘记尝试编写类似C程序的Prolog程序,并尝试解决实际问题。例如,您可以尝试Project Euler系列问题。
答案 1 :(得分:2)
除了评论和现有答案之外,还有更多:
问问自己:你所展示的C程序的用途是什么?它解决了什么问题?我无法回答这个问题,我怀疑你也无法回答这个问题。孤立地说,这个程序没有任何有用的应用程序!因此,尽管C是一种通用编程语言,但您可以编写没有任何目的的程序,一般或特定于域。
同样,当然,Prolog也是如此。
特别指向:它们是绝对内存地址的非常瘦抽象。您可以通过多种方式使用(和滥用)指针,并且,如果您的算法对于您当前正在解决的问题是正确的,则编译器可以生成非常高效的机器代码。然而,Prolog也是如此。然而,范式将大不相同。
总之,你设法写了一个没有任何意义的问题,你激怒了我,没有任何代码就回答了它。
P.S。或者你刚刚成功地控制了我们。
答案 2 :(得分:1)
好吧,既然你标记了swi-prolog你的问题,我可以用Prolog引擎显示我用来交换Qt GUI对象的代码(只是指针,你知道......)。
/** get back an object passed by pointer to Prolog */
template<typename Obj> Obj* pq_cast(T ptr) {
return static_cast<Obj*>(static_cast<void*>(ptr));
}
要使用,例如swipl-win,其中_read_f
实际上是C回调:
/** fill the buffer */
ssize_t Swipl_IO::_read_f(void *handle, char *buf, size_t bufsize) {
auto e = pq_cast<Swipl_IO>(handle);
return e->_read_(buf, bufsize);
swipl-win已成为SWI-Prolog的新控制台。