Определить предикат в прологе - PullRequest
0 голосов
/ 25 апреля 2018

Определить sublist(Xs, Ys): это верно, когда Xs является списком, содержащим некоторые элементы Ys, в том же порядке, в котором они появляются в списке Ys. Например, 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].

Мое решение таково:

sublist([],[]).
sublist([],[_|_]).
sublist([X|Xs],[Y|Ys]):- (
X=Y->sublist(Xs,Ys);
sublist([X|Xs],Ys)
).

Однако выводит только:

X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, c].

что не так с моим решением?

1 Ответ

0 голосов
/ 25 апреля 2018

Как сказано в комментарии, проблема в вашем утверждении if. Вы должны переписать вашу программу так:

sublist([],[]).
sublist([],[_|_]).
sublist([X|Xs],[X|Ys]):-
    sublist(Xs,Ys).

sublist([X|Xs],[_|Ys]):-
    sublist([X|Xs],Ys).

?- sublist(A,[a,b,c]).
A = []
A = [a]
A = [a, b]
A = [a, b, c]
A = [a, c]
A = [b]
A = [b, c]
A = [c]

Кстати, sublist/2 - это встроенный предикат в SWI. Вы можете посмотреть на эту реализацию (взято из здесь ):

sublist(L, L).
sublist(Sub, [H|T]) :-
    sublist_(T, H, Sub).

sublist_(Sub, _, Sub).
sublist_([H|T], _, Sub) :-
    sublist_(T, H, Sub).
sublist_([H|T], X, [X|Sub]) :-
    sublist_(T, H, Sub).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...