Prolog - 按顺序查找子列表

Prolog - Find sublists in order

我目前在我的 Prolog 程序中使用它:

sublist(X, L) :- append(_, S, L), append(X, _, S).

如果我这样调用它,它将正确列出列表的子列表,

?- sublist(A, [1, 2, 3]).
A = [] ;
A = [1] ;
A = [1, 2] ; 
A = [1, 2, 3] ;
A = [] ;
A = [2] ;
A = [2, 3] ;
A = [] ;
A = [3] ;
A = [] ;
false.

我正在寻找一个新函数,它会首先尝试所有较短的子串,这样它就会想出更像

的东西
[1] ; [2] ; [3] ; [1, 2] ; [2, 3] ; [1, 2, 3].

删除空列表并不重要,但会是首选。

following 之一怎么样?使用 SWI-Prolog 我们定义以下规则:

版本 1

sublist_of([X|Xs], [E|Es]) :-
    append(Ruler, _, [E|Es]),      % ensure we get answers in ascending lengths
    same_length(Ruler, [X|Xs]),
    append([_,[X|Xs],_], [E|Es]).

版本 2

sublist_of__ver2([X|Xs], [E|Es]) :-
    append(Ruler, _, [E|Es]),      % ensure we get answers in ascending lengths
    same_length(Ruler, [X|Xs]),
    append([_,[X|Xs],_], [E|Es]).

版本 3a

sublist_of__ver3a([X|Xs], [E|Es]) :-   
    len1_len2_len12([X|Xs], _, [E|Es]),
    append([_,[X|Xs],_], [E|Es]).

len1_len2_len12([], Ys, Zs) :-
    same_length(Ys, Zs).
len1_len2_len12([_|Xs], Ys, [_|Zs]) :-
    len1_len2_len12(Xs, Ys, Zs).

版本 3b

sublist_of__ver3b(Xs, Es) :-
    Xs = [_|_],
    len1_len2_len12(Xs, _, Es),
    append([_,Xs,_], Es).

OP 给出的示例查询:

?- sublist_of__ver2(Xs, [1,2,3,4]).
   Xs = [1      ]
;  Xs = [  2    ]
;  Xs = [    3  ]
;  Xs = [      4]
;  Xs = [1,2    ]
;  Xs = [  2,3  ]
;  Xs = [    3,4]
;  Xs = [1,2,3  ]
;  Xs = [  2,3,4]
;  Xs = [1,2,3,4]
;  false.

为了便于阅读,我交换了参数顺序 - 请原谅我:)

sublist(L, S) :-
 length(L, N),
 between(1, N, M),
 length(S, M),
 append([_,S,_], L).

产量

?- sublist([a,b,c],S).
S = [a] ;
S = [b] ;
S = [c] ;
S = [a, b] ;
S = [b, c] ;
S = [a, b, c] ;
false.

Sicstus-prolog里面sublist(?X,+List).很容易library(lists3).

代码

%   sublist(?Sub, +List)
%   is true when all members of Sub are members of List
:- sublist(?,+) is nondet.
sublist(List, List).
sublist(Sub, [Head|Tail]) :- sublist_(Tail, Head, Sub).

:- sublist_/3 is nondet.
sublist_(Sub, _, Sub).
sublist_([Head|Tail], _, Sub) :- sublist_(Tail, Head, Sub).
sublist_([Head|Tail], X, [X|Sub]) :- sublist_(Tail, Head, Sub).

结果

?- sublist(Y,[1,2,3]).
Y = [1,2,3] ? ;
Y = [2,3] ? ;
Y = [3] ? ;
Y = [] ? ;
Y = [2] ? ;
Y = [1,3] ? ;
Y = [1] ? ;
Y = [1,2] ? ;
no