当我在创建我的 Prolog 列表后运行查询时,Prolog 如何使用范围来解决它?我知道 cut 运算符!
会影响结果。它是通过影响范围来做到这一点的吗?
问问题
2137 次
1 回答
2
首先要做的事情:prolog 是否使用动态范围?不,它没有,它没有的原因是因为 prolog 需要跟踪定义的变量,以便任何新的分配都将引用初始变量——而不是分配给该变量名的最后一个值。
另一方面,Bash 使用动态范围,因此,i
在for
循环中使用变量,并i
在另一个函数中使用变量,这恰好在循环执行期间被调用 - 或不 - 将影响彼此的i
值.
这可能不是很简单,所以举个例子:
#!/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
这里的诀窍是一个变量与一个被认为不同的变量搞砸了。
现在,您可能知道,您无法在 prolog 中执行此操作:
#!/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生成的逻辑编程解是在应用统一算法后得出的。在此过程中,以 DFS 方式构建树状结构,根据变量可能假设的值对语句进行评估。在每个叶级扩展之后,Prolog 会回溯到下一个可用扩展。
如果!
找到 an ,则停止广度扩展,切断局部解的其他可能值,并仅在树中执行更深的扩展。这是!
运算符的一个非常简单的用法。
于 2012-12-07T23:42:29.540 回答