2012-03-27 2 views
2

Я написал предикат найти подсписки:найти все подсписок

sublist([],[]). 
sublist([X|T], [X|TS]) :- 
    sublist(T, TS). 
sublist([_|T], X) :- 
    sublist(T, X). 

Но это не правильно, потому что она не будет выполнена для этого:

sublist([1,2,20,4,5,6],[1,2,4,20]). 

Как изменить этот предикат, чтобы ответить верно. Для этого вопроса, не делая сложность времени намного больше?

+0

Хорошо, что вы даже подразумеваете подмножество, я думаю, так как вы не сохраняете заказ – m09

ответ

0

2015-05-13: Полное переписывание

Это немного неясно, что вы после того, как здесь: Ваш предикат называется sublist, но судя по вашему запросу, например, кажется, что вы после subset ,

Во всяком случае, здесь приведены определения для обоего предикатов:

sublist(?L1, +L2) (порядок и дублирует значение):

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

subset(?L1, +L2) (порядок и дубликаты не имеют значения):

subset([], L). 
subset([X|Xs], L) :- member(X, L), subset(Xs, L). 

Обратите внимание, что эти предикаты m ay существуют как встроенные предикаты реализации вашего пролога. Вы не должны пытаться переопределить их, если это так.

+2

Ваш код также вернет 'true' для'? - подмножество ([1,2], [1,1]). ', Что, вероятно, быть неверным. – twinterer

+0

yup, вам нужно пойти с 'select/3' вместо' member/2'. – m09

+1

bulitin sort работает быстрее я думаю – whd

Смежные вопросы