如何在Prolog中实现指针?

时间:2013-08-30 12:31:38

标签: c prolog swi-prolog

我是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;
}

3 个答案:

答案 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)

好吧,既然你标记了你的问题,我可以用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的新控制台。