簡體   English   中英

Prolog在列表列表中轉換列表

[英]Prolog Convert a list in a list of lists

我需要將元素列表轉換為列表列表。 例如,如果我有列表[1,2,3,4],則輸出必須為[[1],[2],[3],[4]],每個列表一個元素。

create([],_, _, _).
create([H|T], Aux, X, Result) :-
   append([H], Aux, X),
   Result = [X],
   create(T, X, _, Result).

我總是假的...這甚至可能做到嗎?

定義此關系的另一種可能性是使用DCG。 描述列表時,它們產生易於閱讀的代碼。 讓我們繼續使用@false在注釋中建議的名稱singletons:

singletons([]) -->        % the empty list
   [].                    % is empty
singletons([H|T]) -->     % the head of a nonempty list
   [[H]],                 % is a list on its own
   singletons(T).         % and so is the tail

您可以直接用詞組/ 2進行查詢:

   ?- phrase(singletons([1,2,3,4]),X).
X = [[1],[2],[3],[4]]

或寫一個帶有短語/ 2作為單個目標的包裝謂詞:

singletons(L,Ls) :-
   phrase(singletons(L),Ls).

並查詢:

   ?- singletons([1,2,3,4],Ls).
Ls = [[1],[2],[3],[4]]

謂詞也可以以其他方式工作:

   ?- singletons(L,[[1],[2],[3],[4]]).
L = [1,2,3,4] ? ;
no

以及最一般的查詢:

   ?- singletons(L,Ls).
L = Ls = [] ? ;
L = [_A],
Ls = [[_A]] ? ;
L = [_A,_B],
Ls = [[_A],[_B]] ?
...

另外,您還可以定義一個簡單的謂詞,該謂詞在方括號中描述任意元素與其自身之間的關系,然后使用library(apply)中的maplist / 3將其應用於列表的每個元素:

:- use_module(library(apply)).

embraced(X,[X]).

singletons(L,Ls) :-
   maplist(embraced,L,Ls).

對於上述查詢,此版本產生相同的結果。 但是,它效率更高。 要查看該信息,請考慮上面的以下查詢:

   ?- singletons(L,[[1],[2],[3],[4]]).
L = [1,2,3,4]

在上面你必須進入; 使Prolog搜索其他解決方案,隨后失敗(用no表示)。 在此版本中,沒有多余的選擇點,並且Prolog可確定地成功進行查詢。

嘗試這個

create([],[]).

create([H|T],[[H]|T2]):- create(T,T2).

我試過了

?- create([1,2,3,4],X).

結果是

X = [[1], [2], [3], [4]].

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM