Predicate Prolog [Sublist (Xs, Ys)]

I am a new student for the prologue. This is the question of our workshop, I have no idea where to start. It would be very helpful to help with this.

sublist (Xs, Ys)

This is done when Xs is a list containing some of the elements of Ys, in the same order as in the list of Ys. This should work when Ys is the correct list. For instance:

sublist([a,c,e],[a,b,c,d,e]) must succeed.

sublist([a,e,c],[a,b,c,d,e]) should fail.

sublist([a,X,d],[a,b,c,d,e]) must have two solutions X = b and X = c.

sublist(X,[a,b,c])must have eight solutions X=[]; X=[c]; X=[b]; X=[b,c]; X=[a]; X=[a,c]; X=[a,b];and X=[a,b,c].

+4
source share
2 answers

My implementation:

sublist([], []).
sublist([H| Rest1], [H| Rest2]) :-sublist(Rest1, Rest2).
sublist(H, [_ | Rest2]) :-sublist(H, Rest2).

Examples:

?- 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.
+4
source

, , .

, :

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.
0

Source: https://habr.com/ru/post/1657073/


All Articles