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_赋值函数来操作全局变量,但我无法使其工作。