Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables prolog中的变量问题_Variables_Scope_Prolog_Global Variables - Fatal编程技术网

Variables prolog中的变量问题

Variables prolog中的变量问题,variables,scope,prolog,global-variables,Variables,Scope,Prolog,Global Variables,当我调用num(5)时,它会打印5。但是,在调用num(5)之后,当我调用check(5)时,它会打印notok。我认为这是因为变量的范围。我如何使它工作,我的意思是变量不象全局变量,这样我可以在其他子句中检查它的值?Prolog中没有全局变量。如果在所有子句中都需要一个变量,请在这些子句中将其作为参数传递。例如,您使用: num(N) :- No=N, write(No), nl. check(S) :- No==S -> write(Ok) ; write(Not

当我调用
num(5)
时,它会打印5。但是,在调用
num(5)
之后,当我调用
check(5)
时,它会打印notok。我认为这是因为变量的范围。我如何使它工作,我的意思是变量不象全局变量,这样我可以在其他子句中检查它的值?

Prolog中没有全局变量。如果在所有子句中都需要一个变量,请在这些子句中将其作为参数传递。例如,您使用:

     num(N) :- No=N, write(No), nl.

     check(S) :- No==S -> write(Ok) ; write(Not ok).

根据需要调用
check(5,5)
check(S,5)

Prolog中没有全局变量。如果在所有子句中都需要一个变量,请在这些子句中将其作为参数传递。例如,您使用:

     num(N) :- No=N, write(No), nl.

     check(S) :- No==S -> write(Ok) ; write(Not ok).
然后根据需要调用
check(5,5)
check(S,5)

您可以使用swipl或assert/retract的

但是,使用全局变量有点违背声明式编程范式,因为它违反了引用透明性

您可以使用swipl或assert/retract


然而,使用全局变量有点违背声明式编程范式,因为它违反了引用透明性

你所说的引用透明性是什么意思?@svick[基本上,这意味着一个函数的行为类似于一个数学函数:如果给定相同的参数,它将返回相同的结果。在gnu prolog中,我想没有这种情况。@tux4我没有使用gnu prolog:/如果没有任何全局变量,我不会感到惊讶,但您确定没有带有assert/retract的库吗?@thanosQR,af在阅读gnu prolog手册之后,assert和retract被定义了,所以我使用了它们,它们工作了。此外,还有g_assign函数来操作全局变量,但我无法使其工作。你说的引用透明度是什么意思?@svick[基本上,这意味着一个函数的行为类似于一个数学函数:如果给定相同的参数,它将返回相同的结果。在gnu prolog中,我想没有这种情况。@tux4我没有使用gnu prolog:/如果没有任何全局变量,我不会感到惊讶,但您确定没有带有assert/retract的库吗?@thanosQR,af在阅读gnu prolog手册之后,定义了assert和RECTract,所以我使用了它们,它们工作了。此外,还有g_赋值函数来操作全局变量,但我无法使其工作。