寫謂詞
allDistinct/1
,其參數爲(符號)的列表,並且成功,如果列表中的所有符號是不同的。序言:覈對重複列表中的notin(A,[]). notin(A,[B|C]) :- A\=B, notin(A,C). allDistinct([]). allDistinct([_]). allDistinct([A|B]) :- notin(A,B), allDistinct(B).
2
A
回答
4
謂語sort/2
排序,並從列表中刪除重複項。您可以使用它,比較與舊的新的排序列表長度(length/2
謂語),如果他們不同,有一些重複值。
+1
直向,s(X)。但**也確保足夠的實例**! – repeat
4
上一sketch by @whd跟進,我們可以繼續這樣的:
下面我們使用SICStus Prolog的4.3.2:
:-use_module (library (lists)). allDistinct(Es) :- ( ground (Es) ->sort (Es, Fs), same_length (Es, Fs) ; throw (error (instantiation_error , instantiation_error (allDistinct(Es),1))) ).
示例查詢:
| ?- allDistinct([1,2,3]). yes | ?- allDistinct([1,2,3.0]). yes | ?- allDistinct([1,2,3.0,2]). no | ?- allDistinct([1,2,3.0,X]). ! Instantiation error in argument 1 of user:allDistinct/1 ! goal: allDistinct([1,2,3.0,_197])
0
這這些問題之一有相當多的替代合理解決方案。假設公共庫謂詞可以使用,這裏是另一個問題:
all_distinct(List) :-
\+ (
select(Element, List, Tail),
select(Element, Tail, _)
).
這種解決方案的性能優點是,它就停止掃描列表作爲它找到一個重複元件。但是,它比基於標準sort/2
謂詞解決方案快?不清楚sort/2
是在大多數的Prolog系統的高度優化的謂詞。另外,我們沒有忘記,除非我們確信所有列表元素綁定,我們應該是安全的,並檢查它(見@Repeat答案)。
相關問題
- 1. 檢查列表中的重複 - 序言
- 2. 序言 - 列表中的計數重複
- 3. 序言中的重新排序列表
- 4. 序言,複製列表
- 5. 使用列表而不重複的元組/對的序言排列
- 6. 檢查序言中的雙重列表
- 7. 約束編程,列表中的數字重複,序言
- 8. 序言 - 添加從列表中的元素到另一個列表,不重複
- 9. 序言列表連續對
- 10. 重新排列列表元素 - 序言
- 11. 查找列表中重複的對數
- 12. 從列表中清除重複的對
- 13. 序言 - 列表中的序列
- 14. 對序言,列表和對新來說
- 15. 序言列表中的列表
- 16. 重複對象,Java列表
- 17. 如何避免序言中的重複
- 18. 序言中的重複結果
- 19. setolog-like與在序言中的重複?
- 20. 在C語言中刪除鏈接列表中的重複項
- 21. 創建列表不包括重複在序言
- 22. 如何在序言中檢查列表中的可重複變量
- 23. 重複列表中的重複項
- 24. 序言:刪除重複
- 25. 序言:一是重複值
- 26. 序言數據庫重複
- 27. 通過Python中的重複對列表進行排序
- 28. 插入列表的序言序言
- 29. 找到一個列表的列表中重複的對象
- 30. 序言:複製列表到已經分配的列表
'allDistinct(B)'說* *任何列表都是不同的!並且...請指出您需要幫助。你還沒有問過問題。 – lurker
除了縮進,allDistinct(B)調用我不明白爲什麼這個代碼不應該工作。子句allDistinct([_])似乎也是多餘的。 –