如何在Prolog中用指针实现C代码?

如何在Prolog中用指针实现C代码?,c,prolog,swi-prolog,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

我不熟悉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;
}
#包括
int main()
{
INTA=5;
int*p;
p=&a;
printf(“a的地址是%d.”,p);
返回0;
}

用一个流行的比喻,你正试图用螺丝刀把钉子钉进去。Prolog不是C语言,用Prolog解决问题与用C语言解决问题有着根本的不同

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

main :-
    X = 5,
    io:format("X = ~w~n", [X]).
但是你不能像在C中那样得到X的地址,你为什么要这样做呢?由于Prolog具有自动垃圾收集功能,因此下次地址可能会不同


如果你想学习Prolog,就别想写看起来像C程序的Prolog程序,试着解决实际问题。例如,您可以尝试解决Project Euler的一系列问题。

使用一个流行的类比,您正试图用螺丝刀将钉子钉入。Prolog不是C语言,用Prolog解决问题与用C语言解决问题有着根本的不同

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

main :-
    X = 5,
    io:format("X = ~w~n", [X]).
但是你不能像在C中那样得到X的地址,你为什么要这样做呢?由于Prolog具有自动垃圾收集功能,因此下次地址可能会不同


如果你想学习Prolog,就别想写看起来像C程序的Prolog程序,试着解决实际问题。例如,您可以尝试解决Project Euler的一系列问题。

除了注释和现有答案之外,还有更多:

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

当然,Prolog也是如此

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

总而言之,你写了一个毫无意义的问题,让我在没有任何代码的情况下回答


或者你刚刚以中等程度的成功吸引了我们。

除了评论和现有答案,这里还有更多:

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

当然,Prolog也是如此

特别是指针:它们是对绝对内存地址的非常精简的抽象。您可以以多种方式使用(或滥用)指针,并且,如果您的算法对于当前正在解决的问题是正确的,编译器可以生成非常高效的机器代码。然而,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已成为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已成为SWI Prolog中的新控制台。

不知道Prolog,但由于代码显示在
c
中,因此希望告知说明符
%d
对于指针不正确。您应该使用
%p
%u
。您从哪里了解到Prolog可以“像C一样”使用?感谢Dayal rai的帮助info@Dayalrai
%u
应为
无符号int
,这与
%d
应为
int
一样不正确
%p
更好,但在技术上不正确,因为它要求
无效*
。正确的习惯用法是
printf(“%p”,(void*)p)
。C99标准(默认参数升级)第6.5.2.2条中有详细说明。Prolog不支持提取变量的内存地址。所以我知道没有办法写一个像你展示的那样的程序。但是,您可以模仿其他程序的某些过程方面,如
for
while
循环。不知道prolog,但由于显示的代码在
c
中,因此要通知说明符
%d
对于指针不正确。您应该使用
%p
%u
。您从哪里了解到Prolog可以“像C一样”使用?感谢Dayal rai的帮助info@Dayalrai
%u
应为
无符号int
,这与
%d
应为
int
一样不正确
%p
更好,但在技术上不正确,因为它要求
无效*
。正确的习惯用法是
printf(“%p”,(void*)p)
。详细信息见C99标准第6.5.2.2条(默认