2015-09-28 53 views
3

我在Prolog中有這個問題,我在創建一個列表,有時謂詞有助於這個列表創建返回一個空列表,[]。最後,我最終得到一個看起來像[[1, 2, 3], []]的列表,例如,我寧願它是[[1, 2, 3]]如何停止在Prolog中追加到完整列表的空列表?

我如何停止空單,當我被放在與列表的其餘部分退貨嗎?我的邏輯編程並不可怕,但在其他語言中我只是說,如果不是空的話:追加,否則不要做任何事情。

這是可能的Prolog的?

編輯:把它放在一個例子,說我有以下斷言:

put_together(Value1, Value2, Result) :- 
    Result = [Value1, Value2]. 

我打電話put_together(1, 2, Result).,並得到Result = [1, 2]預期。但是,如果我打電話,put_together(1, [], Result).我得到Result = [1, []],我不想要,我寧願有最後的空列表,這將只是[1]

回答

3

DCG中經常描述的序言名單的好方法。這使關於列表的推理更容易。你應該在你的用例中嘗試一下。

例如,「拼湊」(見下文爲什麼這是不是問題一個很好的觀點)兩個列表,就像你說的,你可以使用:

lists_together(Ls1, Ls2) --> 
     list(Ls1), 
     list(Ls2). 

list([])  --> []. 
list([L|Ls]) --> [L], list(Ls). 

樣品情況:

?- phrase(lists_together([a,b,c], [d,e]), Ts). 
Ts = [a, b, c, d, e]. 

?- phrase(lists_together([a,b,c], []), Ts). 
Ts = [a, b, c]. 

這是完全通用的,並在所有方向上的作品。例如嘗試使用最一般的查詢,或迭代加深等。因此,我避免了一個必要的名稱,如put_...,這表明它只能在一個方向上工作。相反,我使用更多的聲明性名稱,這個名稱可以公平地反映這種關係所保持的多個方向。

然而,在你的情況,看來你是莫名其妙,不由自主地,混合不同種類的條款。要表示配對,請勿使用[A,B](即.(A, .(B, []))),而應使用A-B之類的術語。

所以,涉及這樣的對自己的組件,例如使用:

key_value_pair(Key, Value, Key-Value).

0

如果可能的話,我建議你改變你的斷言,讓你總是名單的回報清單,並始終用append/3來組合它們。這樣,您可以吸收空白列表,如果它們是零的零並且不再擔心空列表是角落案例。

DCG的,如mat's answer提到,要堅持用列出了可能的途徑。