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
我目前在我的 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