Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 长度有序子集?_List_Prolog - Fatal编程技术网

List 长度有序子集?

List 长度有序子集?,list,prolog,List,Prolog,我正在尝试生成一个代码,该代码按顺序生成集合的所有子集。 也就是说,调用子集([1,2,3],X)应该生成 X = []; X = [1]; X = [2]; X = [3]; X = [1,2]; X = [1,3]; X = [2,3]; X = [1,2,3]. 内部顺序并不那么重要,只是最小的子集列在第一位(即我不在乎[2,3]是否在[1,2]之前,只在乎[2]和[3]在[2,3]之前) -- 到目前为止,我已经尝试了两种方法。首先我试着自己做谓词 subset([], []). su

我正在尝试生成一个代码,该代码按顺序生成集合的所有子集。 也就是说,调用
子集([1,2,3],X)
应该生成

X = [];
X = [1];
X = [2];
X = [3];
X = [1,2];
X = [1,3];
X = [2,3];
X = [1,2,3].
内部顺序并不那么重要,只是最小的子集列在第一位(即我不在乎[2,3]是否在[1,2]之前,只在乎[2]和[3]在[2,3]之前)

--

到目前为止,我已经尝试了两种方法。首先我试着自己做谓词

subset([], []).
subset(List, []).
subset(List, [N]) :-
    member(N, List).

subset(List, [N|Rest]) :-
    !,
    nth0(I, List, N),
    findall(E, (nth0(J, List, E), J > I), NewList),
    subset2(NewList, Rest).
…但它甚至没有达到预期的效果。其次,我尝试使用list\u to\u ord\u set/2制作电源集(使用)并进行排序,但我也无法让它工作


帮助?

我找到了一个不那么优雅的解决方案。。。它需要一个切口和一些内置物

subset(Xs, Ys) :-
    length(Xs, L),
    between(0, L, N),
    length(Ys, N),
    assign(Xs, Ys).

assign(_, []) :- !.
assign([X|Xs], [X|Ys]) :-
    assign(Xs, Ys).
assign([_|Xs], Ys) :-
    assign(Xs, Ys).
正如@Fatalize所指出的,我们可以避免剪切,只需在1^子句的第一个参数上强制执行空列表:

assign([], []).
assign([X|Xs], [X|Ys]) :-
    assign(Xs, Ys).
assign([_|Xs], Ys) :-
    assign(Xs, Ys).

我避免交换2 ^和3 ^子句,所以“自然”顺序仍然很好地保存

,也总是考虑在描述列表时使用。

例如:

list_sublist(Ls0, Ls) :-
        same_length(Ls0, Ls1),
        append(Ls, _, Ls1),
        phrase(sublist(Ls0), Ls).

sublist([])     --> [].
sublist([L|Ls]) --> ( [] ; [L] ), sublist(Ls).
?- list_sublist(Ls, [b,c]).
Ls = [b, c] ;
Ls = [_G511, b, c] ;
Ls = [b, _G514, c] ;
Ls = [b, c, _G517] ;
etc.
示例查询:

?- list_sublist([a,b,c], Ls). 
Ls = [] ;
Ls = [c] ;
Ls = [b] ;
Ls = [a] ;
Ls = [b, c] ;
Ls = [a, c] ;
Ls = [a, b] ;
Ls = [a, b, c] ;
false.
另一个例子:

list_sublist(Ls0, Ls) :-
        same_length(Ls0, Ls1),
        append(Ls, _, Ls1),
        phrase(sublist(Ls0), Ls).

sublist([])     --> [].
sublist([L|Ls]) --> ( [] ; [L] ), sublist(Ls).
?- list_sublist(Ls, [b,c]).
Ls = [b, c] ;
Ls = [_G511, b, c] ;
Ls = [b, _G514, c] ;
Ls = [b, c, _G517] ;
etc.
最普遍的情况:

?- list_sublist(Xs, Ys).
Xs = Ys, Ys = [] ;
Xs = [_G513],
Ys = [] ;
Xs = Ys, Ys = [_G513]
Xs = [_G513, _G516],
Ys = [] ;
etc.

如果使用
assign([],[]),则不需要剪切。
而不是第一条规则?如果出于某种原因,您想去掉最后一个输出
false
的求值,您可以交换第二个和第三个
assign
规则的顺序。它更改了顺序,但根据OP的要求仍然有效。@Fatalize:需要剪切以避免重复的解决方案,而接受XsI子列表的anon变量无法获得它。我得到了与这些变化完全相同的结果。想提供一个需要cut和匿名变量的示例吗?是的,它很有效!我会让它成为公认的答案,但我会在几天后回来看看,以寻找你所说的“更优雅”的东西。@Fatalize:你说得对,应用你所描述的更改,我们会得到与“内部”顺序相反的解。s(X):我真的很喜欢
子列表//1
。写
([]|[L])
而不是
([];[L])
怎么样?我通常非常赞成在DCGs中使用
,+1!当变量不确切地称为
L
时,它可能更可读,不是吗?将
[].[L]
或可读性稍差的
[].[L]
[]进行比较;[五十] 
[];[五十] 
。既然我真的想在这种情况下使用
L
,我发现
在这种具体情况下可读性稍高。我肯定会在像
[].[\u124;]
这样的情况下使用
。有关于ASCII字符在困难阅读条件下的视觉相似性的数据吗?类似于行话文件“伟大的符文”,但不是大写字母对小写字母,而是大写字母对大写字母。我猜“L”是坏的,当可能有任何“[iii17”)(加上一些,如果我们考虑用斜体来强调某事)……这将是非常有趣的!我目前还没有正式的关于这件事。肯定有点什么!只看<代码> [i i是]。
在阅读困难的情况下……也许UX人员可以提供帮助:眼睛跟踪加上皮肤电导测量,也许?