當我在創建Prolog列表後運行查詢時,Prolog如何使用範圍解決它?我瞭解裁減運算符!
可能會影響結果。它是否通過影響範圍來做到這一點?Prolog是否使用靜態或動態範圍界定?
3
A
回答
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是!
運算符的一個非常簡單的用法。
相關問題
- 1. 問題關於靜態和動態範圍界定問題
- 2. 動態作用域和靜態範圍
- 3. 靜態範圍VS動態作用域
- 4. 本練習中的靜態和動態範圍界定有什麼區別?
- 5. 如何使用Emacs Lisp動態範圍界定?
- 6. PHP範圍問題或靜態問題
- 7. Go界面:靜態與動態綁定
- 8. 是否使用靜態類或不
- 9. 動態範圍
- 10. 定義動態範圍
- 11. 靜態範圍內的活動聯盟
- 12. AS3:靜態範圍問題
- 13. C#靜態類和範圍
- 14. 靜態字段的範圍是什麼?
- 15. 靜態類的範圍是什麼?
- 16. 動態範圍界定 - 深度綁定vs淺綁定
- 17. 在Excel中將靜態日期範圍更改爲動態日期範圍
- 18. VBA:Protection.AllowEditRanges動態範圍
- 19. 用於動態範圍?
- 20. PHP的範圍('A','Z')是否返回一個靜態數組?
- 21. 使用靜態或非靜態類
- 22. 使用「最終靜態」還是「靜態最終」是否正確?
- 23. 動態用戶界面vs靜態用戶界面
- 24. ASP.NET緩存值的範圍是否與靜態變量相同或更窄?
- 25. 切片或陣列的動態範圍
- 26. 靜態或動態ips
- 27. 靜態或動態數組
- 28. Perl中詞法和動態範圍界定有什麼區別?
- 29. 動態和靜態範圍程序差異
- 30. 程序語言理解 - 靜態vs動態範圍