2013-04-23 153 views
0

我需要一些關於三個序言謂詞的幫助來檢查和操作列表。我是新的prolog和任何幫助將不勝感激。序言列表謂詞

三個謂詞是:

  • double_up(+List1, -List2)爲真時List2具有List1每個元素兩次。查詢double_up([a,b,c],X)應該給X=[a,a,b,b,c,c]。輸出列表中元素的順序無關緊要。
  • pivot(+List1, +Pivot, -Smaller, -GreaterEq)是真實的,當Smaller是一個數字比PivotList1小名單,並GreaterEq是數字的List1大於或等於Pivot列表。
  • fancy_replace(+List, +Takeout,+Putin, -NewList, -Count)爲真時NewList是相同的列表作爲輸入List,但是其中列表中的每個元素Takeout置換爲Putin元件。計數應該是被取代的外賣數量。例如,查詢fancy_replace([9,10,1,9,2],9,0, X, C)應該給X = [0,10,1,0,2]C = 2。輸出列表中元素的順序無關緊要。
+2

等等。普京?什麼? – 2013-04-23 07:01:26

+1

我有同樣的反應:)希望克格勃不會對此發出警報...... – CapelliC 2013-04-23 07:21:10

回答

-1

說實話,我討厭序言......即使它很有趣,易於你學會後

我想這是因爲我無法理解序言中是如何工作的幾個星期前,一個很好的參考。 what does the follow prolog codes do?

無論如何..這是你的第一個問題的答案;希望你能解決剩下的自己:d

double([]). 
double([H|[]], [H,H|[]]). 
double([H|T],[H,H|T1]):- double(T, T1). 

順便說一句,這可能不是唯一的解決辦法...但它的工作原理

+0

我無法想象你可以對一個醜陋複雜語言的開發者做些什麼(如...選擇一個:) – CapelliC 2013-04-23 06:10:27

+1

第二個條款是包含在第三條款中,您可以將其刪除。此外,您可以將'[H | []]'簡寫爲'[H]',將[H,H | []]'寫爲'[H,H]'。 – mat 2013-04-23 07:17:40

1

的簡單模式處理列表中的Prolog規定與2遞歸謂詞參數,匹配 - 傳統 - 輸入和輸出數據,以及基本情況,停止遞歸,匹配空列表。然後

double_up([X|Xs], [X,X|Ys]) :- double_up(Xs, Ys). 
double_up([], []). 

該斷言它比真實需要什麼更多一般一點,因爲它的工作原理也是模式double_up(-List1, +List2)。例如

?- double_up(L,[1,1,2,2]). 
L = [1, 2]. 

要限制所要求的模式,我認爲這是必要白白代碼複雜,動中有服務謂詞清潔循環,並留下double_up只是爲了測試的參數:

double_up(I, O) :- is_list(I), var(O), double_up_(I, O). 
double_up_([X|Xs], [X,X|Ys]) :- double_up_(Xs, Ys). 
double_up_([], []). 

樞軸/ 4可以是 '單行' 在SWI-Prolog的:

pivot(List1, Pivot, Smaller, GreaterEq) :- 
    partition(>(Pivot), List1, Smaller, GreaterEq). 

狀分,與foldl從庫(apply)這是一個容易實現最後需要的謂詞:

fancy_replace(List, Takeout, Putin, NewList, Count) :- 
    foldl(swap_n_count(Takeout, Putin), List, NewList, 0, Count). 
swap_n_count(Takeout, Putin, L, N, C0, C) :- 
    ( L == Takeout 
    -> N = Putin, C is C0 + 1 
    ; N = L, C = C0 
    ).