Q
瞭解附加語法
2
A
回答
3
讓我們首先考慮在隔離條款的唯一目標:
?- append([H|T], _, L).
這是什麼意思?使用純粹的Prolog代碼,有一個很好的和方便的方式來了解更多關於關係:只需在頂層發佈查詢,看看什麼樣的解決方案。
試一試吧!例如:
?- append([H|T], _, L). L = [H|_1282], T = [] ; L = [H, _1078|_1096], T = [_1078] ; L = [H, _1078, _1084|_1108], T = [_1078, _1084] ; L = [H, _1078, _1084, _1090|_1120], T = [_1078, _1084, _1090] ; etc.
由此我們看到,append/3
這個調用定義了它的參數之間的關係,我們看到下面的模式:
L
總是包括:
H
爲第一個元素- 後面跟着所有元素
T
- f由後綴貶低。
這不是suprising,因爲這正是append([H|Ts], _, Ls)
意味着:[H|Ts]
其次任何列表中的所有構成列表 Ls
。
在您的具體使用案例中,很顯然L
是爲了實例化,所以後綴不能任意長。
例如:
?- append([H|T], _, [a,b,c]). H = a, T = [] ; H = a, T = [b] ; H = a, T = [b, c] ; false.
所以我們看到整個條款的含義(我已經改名變量,使列表由後綴 小號在變量名錶示):
powerset(Ls, [H|Ts]):- append([H|Ts], _, Ls).
如果Ls
是包含作爲其第一元件H
,隨後元件Ts
列表,其次是什麼都沒有,然後列表[H|Ts]
是L
的powerset的成員。
通俗地說:
列表中的每一個非空前綴是冪的一員。
而從這個我們也看到powerset/2
一個明顯的遺漏,因爲它出現在這個線程:該條款中沒有得到的空 設置爲冪的一員,更令人不安的是,他們沒有接受空集爲一組有效的,所以下面的錯誤失敗:
?- powerset([], _). false. % empty set is not a set?
練習:正確powerset/2
,以便它實際上成功了所有powerset的元素。
相關問題
- 1. 瞭解語法
- 2. Jquery:瞭解語法
- 3. 瞭解LINQ語法
- 4. 瞭解DART語法
- 5. 瞭解Javascript語法?
- 6. 瞭解YUI模塊加載並附加
- 7. 瞭解算法的語言語法
- 8. 瞭解Ruby和Sinatra語法
- 9. 瞭解Java語法錯誤
- 10. 試圖瞭解CSS3語法
- 11. 瞭解SQL Cusros語法
- 12. C#:瞭解事件語法
- 13. 瞭解COALESCE的語法
- 14. 瞭解Ruby分配語法
- 15. 瞭解C++結構語法
- 16. 瞭解ExtJS框架語法
- 17. 瞭解Lucene的語法
- 18. 附加擴展方法的語法
- 19. 瞭解Python語法/表示法
- 20. 瞭解內附環境
- 21. 瞭解圖形,加權法
- 22. 四位加法器瞭解
- 23. 瞭解加入和組的SQL語句
- 24. 應用附加參數語法
- 25. 附近有語法錯誤「加入」
- 26. 附加數據庫語法錯誤
- 27. 附近有語法錯誤「加入」
- 28. 附加信息:語法錯誤。從表
- 29. 替代語法應用附加屬性
- 30. Javascript附加一個對象語法糖?