gpt4 book ai didi

prolog - Prolog 使用静态作用域还是动态作用域?

转载 作者:行者123 更新时间:2023-12-02 02:08:59 26 4
gpt4 key购买 nike

当我在创建 Prolog 列表后运行查询时,Prolog 如何使用作用域来解决它?据我所知,剪切运算符 !会影响结果。它是通过影响范围来做到这一点的吗?

最佳答案

第一件事:prolog 是否使用动态范围?不,它没有,它没有的原因是因为 prolog 需要跟踪定义的变量,以便任何新的赋值都将引用初始变量——而不是分配给该变量名的最后一个值。

另一方面,Bash 使用动态范围,因此,使用变量 ifor循环,并使用变量 i在另一个函数中,该函数恰好在——或不——循环执行期间被调用,将影响彼此的 i值(value)。

这可能不是很简单,所以,举个例子:

#!/bin/bash
function my_first_I() {
I=10;
}
function my_second_I() {
I=100;
}

I=1; echo $I;
my_first_I; echo $I;
my_second_I; echo $I;

输出:
$ ./script.sh
1
10
100

这里的诀窍是一个变量正在与一个被认为是不同的变量混淆。

现在,正如您可能知道的,您无法在序言中做到这一点:
#!/usr/bin/swipl
my_first_I(I) :- I is 10.
my_second_I(I) :- I is 100.

test(I) :-
I is 1,
write(I), nl,
my_first_I(_),
write(I), nl,
my_second_I(_),
write(I), nl.

输出:
?- test(I).
1
1
1
I = 1.

这个例子只是简单地指出,在 prolog 中,变量是在它自己的局部范围内定义的,没有泄漏到另一个函数的定义中。

现在,第二部分:如何 !工作? Prolog生成的逻辑编程解决方案是应用 unification algorithm后推导出来的。 .在此过程中,树状结构以 DFS 方式构建,根据变量可能假定的值对语句进行评估。在每个叶级扩展之后,Prolog 回溯到下一个可用的扩展。

如果 !找到后,停止广度扩展,切断局部解的其他可能值,只在树中执行更深的扩展。 Here! 的一个非常简单的用法运算符(operator)。

关于prolog - Prolog 使用静态作用域还是动态作用域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13755456/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com