Составить из положительных элементов списка все списки заданной длины

      Комментарии к записи Составить из положительных элементов списка все списки заданной длины отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Составить из положительных элементов списка все списки заданной длины

В этой теме 3 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 1 год, 11 мес. назад.

  • Автор
    Сообщения
  • #1893

    questioner
    Участник

    Здравствуйте, помогите решить задачу:

    Дан список из целых чисел. Составить из элементов этого списка все списки заданной длины, содержащие только положительные элементы.

    Пример:

    задача([1,2,-2,3,-4,5], 3, X) 
    X=[[1,2,3],[1,2,5],[1,3,5],[1,3,2],[1,5,2],[1,5,3],и т.д..]

  • #1894

    Раздели задачу на простые части:

  • #1895

    questioner
    Участник

    Вот как вижу реализацию я, по отдельности предикаты работают, но в итоге добиться того что мне нужно не могу, кажется проблема в bagof а именно с названием переменных, посмотрите пожалуйста.

    filter([],[]).
    filter([A|L], [A|N]):- A > 0, filter(L, N).
    filter([A|L], N):- A < 0, filter(L,N).
     
    member_list([], _).
    member_list([Head|Tail], List):-
      member(Head, List),
      delete(List, Head, List2),
      member_list(Tail, List2).
     
    select_lists(L1, N, R):-
      filter(List, N),
      bagof(List, (
       length(List, N),
       member_list(List, L1)), R
      ).

  • #1896

    Ваш filter я подправил слегка:

    filter([], []):-!.
    filter([Positive|Tail], [Positive|TailFiltered]):-
      Positive > 0, !, filter(Tail, TailFiltered).
    filter([_Negative|Tail], TailFiltered):-
      filter(Tail, TailFiltered).

    Если исходный список пуст – результатом является пустой список.
    В остальных случаях вычисляется результат рекурсивной обработки хвоста списка, к которому может быть добавлен первый элемент списка (если он больше ноля).

    Остается лишь вызвать функцию permutation.

Для ответа в этой теме необходимо авторизоваться.