2012-12-07 24 views

回答

2

首先要做的是:prolog是否使用動態範圍?不,它沒有,它不這樣做的原因是因爲prolog需要跟蹤定義的變量,所以任何新的賦值都會引用初始變量 - 而不是分配給該變量名稱的最後一個值。另一方面,Bash使用動態作用域,因此,在for循環中使用變量i,並在另一個函數中使用變量i,在另一個函數中使用變量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 

這裏的技巧是一個變量與搞亂思想到不同一。

現在,你可能會意識到,你不能夠在這個序言:

#!/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生成的邏輯編程解決方案是在應用unification algorithm之後派生的。在此過程中,以DFS方式構建樹狀結構,根據變量可能假定的值對語句執行評估。在每個葉級擴展之後,Prolog會回溯到下一個可用的擴展。

如果找到!,則停止寬度擴展,會切斷本地解決方案的其他可能值,並且僅執行樹中更深入的擴展。 Here!運算符的一個非常簡單的用法。