2017-10-08 64 views
0

我有許多包含字母列表,我已經寫了檢查是否有存在重複這些給定列表中的一個謂詞:如何讓謂詞在Prolog中重複N次?

noDuplicates([]). 
noDuplicates([H|T]):- 
    not(member(H, T)), 
    noDuplicates(T). 

我有10個名單,我想知道是否有在其中任何一個沒有重複,所以我讓他們到一個大名單,類似的子列表:

[[A,B,C], [C,A,D], [E,F,G]...]] 

(在大名單所以可以有重複,但不是個別子列表)。

我知道我必須做10次重複測試;一次爲每個子列表,但我怎麼寫在Prolog?我可能會寫下10次,但我的猜測是我可以使用遞歸來使序言重複,直到所有的子列表都被檢查過。

所以基本上:我想這個謂詞重複N次,直到N是10.我真的很努力。有沒有人有什麼想法做什麼?

回答

4

讓我們概括的問題如下:

你有一個謂語p/1,表達你想要的東西了名單。

因此,爲了電梯這個定義這些名單的列表,你可以定義一個謂詞ps/1如下:

 
ps([]). 
ps([L|Ls]) :- 
     p(L), 
     ps(Ls). 

你看到這種模式每一次,你可以使用maplist/2。即,以上是等效到:

 
ps(Ls) :- maplist(p, Ls). 

目標maplist(p, Ls)爲真當且僅當p保持用於每個元件的  LsL

請注意,如果按照「循環」和「重複」的方式考慮,它會限制您對Prolog的理解。這些是必要的概念,並且只有當列表已經完全實例化時纔有意義。但是,從Prolog,我們期望更多:我們期望一個完整的關係也生成名單,其中的關係成立。在這種情況下,沒有什麼可以「重複」的:我們從無到有,並向Prolog詢問 中的有哪些解決方案

因此,認爲在描述的條件時的關係ps/1適用於列表的列表:

  1. 它持有的空單[]
  2. 它擁有的名單[L|Ls]如果我們最初的謂詞(p/1)適用於Lps/1持有的剩餘列表Ls

聲明閱讀適用於各個方向,無論有多少列表元素已經被實例化,如果 任何。它適用於10  列表以及0和  50.