我需要定義一個謂詞來檢測列表是否包含重複的元素。我無法使用findall/3
或相關謂詞。我不想刪除重複項,我想知道是否存在重複或重複的元素,然後在集合中存在重複項的情況下使用Prolog輸出'yes',如果沒有重複項,則選擇'否'。我是Prolog的新手,我不知道如何在Prolog中不使用謂詞的情況下做到這一點。我需要想出一個新的(如冗餘/ 1或其他性質)。有人能幫助嗎?創建一個謂詞來檢測列表是否包含Prolog中的重複元素
回答
一個有趣的方式:使用sort/2
對列表進行排序,刪除重複項。檢查初始列表的長度是否大於排序列表的長度。
redundant(List) :-
sort(List, Sorted),
length(List, A),
length(Sorted, B),
A > B.
不,我不能使用Prolog已經內置的代碼。我想到了這樣的: 冗餘(X,X)。 冗餘([X | L]): - 紅色(X,L)。 冗餘([_ | L]): - 冗餘(L)。 red(X,[X | _])。紅(X,[_ | L]): - 紅(X,L)。 但它在Prolog中顯示錯誤。 – user3330438
使用您嘗試的代碼更新問題(或創建一個新問題),並更明確地描述可以使用什麼和不能使用什麼。 –
你的問題有一個含糊之處:你是什麼意思的重複元素?根據(=)/2
(邏輯相等),(==)/2
(語法相等)還是(=:=)/2
(算術相等)應該相等。
我會假設第一個。
以語法立場:
contains_duplicate(L) :-
phrase((..., [E], ..., [E], ...), L).
... --> [] | [_], ... .
現在,我們不僅可以測試一些元素的具體名單,但我們甚至可以問一般問題(我將在這裏使用GNU-Prolog的,其綜合的原因輸出):
| ?- contains_duplicate(L).
L = [A,A] ? a
L = [A,A,_]
L = [A,A,_,_]
L = [A,A,_,_,_]
L = [A,A,_,_,_,_]
L = [A,A,_,_,_,_,_]
L = [A,A,_,_,_,_,_,_]
L = [A,A,_,_,_,_,_,_,_]
L = [A,A,_,_,_,_,_,_,_,_] ...
所以Prolog給我們提供了前兩個元素作爲重複項的所有列表。其他可能性在哪裏?不幸的是,它們隱藏在這個無限次序的答案後面。但是,我們有運氣,我們可以做一個公平枚舉像這樣所有的答案:
| ?- length(L,_),contains_duplicate(L).
L = [A,A] ? a
L = [A,A,_]
L = [A,_,A]
L = [_,A,A]
L = [A,A,_,_]
L = [A,_,A,_]
L = [A,_,_,A]
L = [_,A,A,_]
L = [_,A,_,A]
L = [_,_,A,A]
L = [A,A,_,_,_] ...
- 1. ECLiPSe謂詞用於檢查列表是否包含另一個列表中某些位置的元素
- 2. 謂詞來檢測是否指定Prolog項(變得更具體)
- 3. 檢查一個列表是否包含另一個列表中的元素
- 4. Prolog測試謂詞是否失敗
- 5. 如何創建一個Core Data謂詞來測試一個關係是否包含所有給定的對象?
- 6. 使用特定的謂詞打亂Prolog中的元素列表?
- 7. 滿足一元Prolog謂詞
- 8. 檢查列表是否包含至少一個非零元素
- 9. PROLOG:檢查第一個列表是否包含比第二個列表少3倍的元素
- 10. 檢查元素是否包含jQuery中的另一個元素
- 11. python:在基於謂詞的列表中重複元素
- 12. 從Prolog中的列表構建複合謂詞
- 13. 如何檢測列表是否包含重複項?
- 14. 在一些候選元素中構成一個包含元素的小列表,其中每個元素的包含依賴於一個獨立的謂詞?
- 15. 如何檢查列表是否包含連續重複的元素?
- 16. Prolog,檢查一對元素是否出現在列表中
- 17. 檢查兩個列表是否包含相同的元素
- 18. 從Prolog的謂詞中「返回」列表
- 19. 在Prolog的列表中應用謂詞
- 20. lambda查看列表是否包含來自另一個列表的元素
- 21. 檢測一個字文件是否包含重複
- 22. 檢查一個URL是否包含Python中列表中的所有元素
- 23. prolog中的謂詞
- 24. Haskell函數測試一個列表是否重複(重複)元素
- 25. 如何測試矢量是否包含重複元素?
- 26. Lisp:確定列表是否包含謂詞
- 27. iPhone NSPredicate如何創建一個謂詞來檢查屬性是否有值?
- 28. 編寫一個Prolog謂詞來爲另一個謂詞提供默認參數
- 29. 在Linq中,如何查找一個集合是否包含一個沒有使用Count(謂詞)的元素?
- 30. 涉及列表的Prolog謂詞
你可以做任何的嘗試呢?這是作業嗎? – lurker
什麼樣的謂詞被認爲與'findall/3'有關?你允許使用'member/2'嗎?只需編寫一個使用'member/2'的版本,然後編寫你自己的'member/2'。這相當微不足道。 – lurker
只需重新執行'findall'。問題解決了。 – nhahtdh