4

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

4

1 回答 1

2

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

另一方面,Bash 使用动态范围,因此,ifor循环中使用变量,并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 回答