[英]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.