Prolog列表列表获取所有元素

Posted

技术标签:

【中文标题】Prolog列表列表获取所有元素【英文标题】:Prolog list of lists get all elements 【发布时间】:2018-11-05 14:27:12 【问题描述】:

我有一个列表:

decide([[1,2,-3],[-2,3],[6],[4]],K). 

我想按“;”返回所有可能的解决方案。

规则是首先返回其列表大小为 1 的值。

然后我想返回它的大小大于1的值。

size([],0).
size([_|Xs],L) :- size(Xs,N),L is N+1.

head([],[]).
head([X|_],X).

return_list_members([X|_], X).
return_list_members([_|T], X):-return_list_members(T, X).


decide([], []).
decide([L|Ls], Lit):- size(L, N), N == 1, head(L, Lit).
decide([L|Ls], Lit):- size(Ls, N), N == 0, head(L, Lit), !.
decide([L|Ls], Lit):- decide(Ls, Lit) ,return_list_members(Ls, Lit)

示例结果应该如何:

? - decide([[1,2,-3],[-2,3],[6],[4]],K).
K = 6 ;
K = 4 ;
K = -2 ;
K = 3 ;
K = -3 ;
K = 2 ;
K = 1.

我的目标是首先返回只有一个值的列表。然后一一返回其他列表的所有元素。我有代码的表格,只返回列表的第一个元素,因为我有头部调用。我如何不仅可以返回头部值,还可以返回所有其他值,并且不重复?我试图创建一个函数来返回列表的所有元素。

有什么建议吗?

【问题讨论】:

你不是基本上在这里问了同样的问题吗? Return elements list of list prologs @lurker: 嗯,这是相反的方式 【参考方案1】:

以您的other question 为起点,只需插入您的新要求:

listoflist_member(Xss, X) :-
   ( Xs = [_] ; Xs = [_,_|_] ),           % new
   member(Xs, Xss),
   member(X, Xs).

【讨论】:

以上是关于Prolog列表列表获取所有元素的主要内容,如果未能解决你的问题,请参考以下文章

使用Prolog规则在查询中显示给定列表的第一个元素?

列表替换中的 Prolog 元素

检查元素后返回列表的Prolog谓词

列表中的唯一元素(Prolog)

Prolog - 如何返回每个元素只出现一次的列表?

Prolog中的列表练习列表