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