1

我是序言的新手。我了解到,虽然它是一种声明性语言,但 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;
}
4

3 回答 3

3

使用一个流行的类比,您正在尝试使用螺丝刀钉入钉子。Prolog 不是 C,在 Prolog 中解决问题与在 C 中解决问题根本不同。

打印变量的值很容易,例如:

main :-
    X = 5,
    io:format("X = ~w~n", [X]).

但是您不能像在 C 中那样获得 X 的地址。您为什么要这样做?由于 Prolog 具有自动垃圾收集功能,下次地址可能会有所不同。

如果您想学习 Prolog,请忘记尝试编写看起来像 C 程序的 Prolog 程序,而是尝试解决实际问题。例如,您可以尝试 Project Euler 系列问题。

于 2013-08-30T12:47:11.247 回答
2

除了评论和现有答案之外,还有更多:

问问自己:你展示的 C 程序有什么用?它解决了什么问题?我无法回答这个问题,我怀疑你也无法回答。孤立地看,这个程序没有任何有用的应用程序!因此,尽管 C 是一种通用编程语言,但您可以编写没有任何目的、通用或特定领域的程序。

当然,Prolog 也是如此。

特别是指针:它们是对绝对内存地址的非常薄的抽象。您可以通过多种方式使用(和滥用)指针,并且如果您的算法对于您当前正在解决的问题是正确的,那么编译器可以生成非常高效的机器代码。然而,Prolog 也是如此。然而,范式将非常不同。

总而言之,您设法编写了一个如此毫无意义的问题,以至于您激怒了我而没有任何代码来回答它。

PS 或者你刚刚以适度的成功欺骗了我们。

于 2013-08-30T13:44:05.713 回答
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 中的新控制台。

于 2013-08-30T16:09:40.617 回答