我是prolog的新手。这是我们车间的问题,我不知道从何说起。如果有任何帮助,我将非常感谢。
分表(x, y)
当x是一个包含y中的某些元素的列表,且它们在列表Ys中出现的顺序相同时,这个条件成立。只要y是合适的列表,这个方法就可以工作。例如:
sublist([a,c,e],[a,b,c,d,e])
应该成功。
sublist([a,e,c],[a,b,c,d,e])
应该失败
sublist([a,X,d],[a,b,c,d,e])
应该有两个解X=b和X=c。
sublist(X,[a,b,c])
应该有X=[]; X=[c]; X=[b];
、X=[b,c]; X=[a]; X=[a,c]; X=[a,b];
、X=[a,b,c]
这8种溶液
sublist([], []).
sublist([H| Rest1], [H| Rest2]) :-sublist(Rest1, Rest2).
sublist(H, [_ | Rest2]) :-sublist(H, Rest2).
例子:
?- sublist(X,[a,b,c]).
X = [a, b, c] ;
X = [a, b] ;
X = [a, c] ;
X = [a] ;
X = [b, c] ;
X = [b] ;
X = [c] ;
X = [].
?- sublist([a,c,e],[a,b,c,d,e]) .
true ;
false.
?- sublist([a,e,c],[a,b,c,d,e]) .
false.
?- sublist([a,X,d],[a,b,c,d,e]).
X = b ;
X = c ;
false.
请注意,子列表需要其元素在原始列表中连续。
有了这个定义,通过定义辅助谓词前缀和后缀来定义子列表会更容易,示例取自Shapiro的书:
prefix([], _).
prefix([X|Xs], [X,Ys]) :-
prefix(Xs, Ys).
suffix(Xs, Xs).
suffix(Xs, [_|Ys]) :-
suffix(Xs, Ys).
-然后只需将子列表定义为前缀或后缀:
sublist(Xs, Ys) :-
prefix(Ps, Ys),
suffix(Xs, Ps).
结果:?- sublist(X, [1,2,3]).
X = [] ;
X = [1] ;
X = [] ;
X = [1, 2] ;
X = [2] ;
X = [] ;
X = [1, 2, 3] ;
X = [2, 3] ;
X = [3] ;
X = [] ;
false.
—或作为后缀的前缀:
sublist(Xs, Ys) :-
prefix(Xs, Ss),
suffix(Ss, Ys).
结果:?- sublist(X, [1,2,3]).
X = [] ;
X = [] ;
X = [] ;
X = [] ;
X = [1] ;
X = [2] ;
X = [3] ;
X = [1, 2] ;
X = [2, 3] ;
X = [1, 2, 3] ;
但是我们也可以做一个递归定义:
sublist(Xs, Ys) :-
prefix(Xs, Ys).
sublist(Xs, [_|Ys]) :-
sublist(Xs, Ys).
结果:?- sublist(X, [1,2,3]).
X = [] ;
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [] ;
X = [2] ;
X = [2, 3] ;
X = [] ;
X = [3] ;
X = [] ;
false.