На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Пролог списки , Пару вопросов
    Всем привет, вот играюсь со списками в прологе

    И вот решил спросить почему у меня не получается, того что я ожидаю от пролога

    ExpandedWrap disabled
      has(X,[_|Y]) :-
      has(X,Y). % если элемент хвоста равен искомому элементу значение будет «истина»


    Допустим мы берём элемент и список. В конечном результате у нас false
    ExpandedWrap disabled
      ?- has(2,[1,2,3]).
      не хватает граничного условия рекурсии.
      % искомый элемент совпал с головой списка
      has(H,[H|_]).
      %искомый элемент содержится в хвосте списка
      has(X,[_|T]):-
      has(X,T).
        Цитата Swetlana @
        не хватает граничного условия рекурсии.
        % искомый элемент совпал с головой списка
        has(H,[H|_]).
        %искомый элемент содержится в хвосте списка
        has(X,[_|T]):-
        has(X,T).

        Вы Светлана как всегда на высоте, а я вот хочу понять списки и написать програмки. ну пока что туго выходит :(

        Добавлено
        Суть такова проверить лист, все ли цифры у нас стоят по порядку.

        Т.е как я понимаю. Берём лист, отсекаем Head, Tail дальше сравниваем Head < Tail, дальше с отсатка Tail дальше делим Head, Tail и так проверяем пока нету в списке Head > Tail и как только первый находим делаем отсечение ! и пишем faise
          Может, вот это поможет?
          Прикреплённый файлПрикреплённый файл_____________________.rar (26,12 Кбайт, скачиваний: 1108)
            мда чего-то не распечатывает линукс файлы с русским именем, сейчас попробую через терминал

            Добавлено
            Всё распаковал иду читать спасибо
              Цитата
              Суть такова проверить лист, все ли цифры у нас стоят по порядку.


              %в пустом списке всё в порядке
              check([]).
              %в одноэлементном тоже
              check([X]).
              % рекурсивное правило для списка хотя бы из двух элементов
              check([X,Y|T]):-
              X<=Y,
              check(T).
              Сообщение отредактировано: Swetlana -
                мда задачки простые а я вот читаю, по кускам со всех сайтов и пока не понял.

                иду почитаю и постараюсь вникнуть :wall:
                  Идея простая. Если в списке выделяем голову, то имеем граничное условие для пустого списка и рекурсивное правило для непустого. Обрабатываем первый элемент, для хвоста вызываем рекурсию.

                  В вашей задаче нужно было выделить два первых элемента [X,Y|T], поэтому получилось два граничных условия - одно для обработки пустого списка, второе - для одноэлементного.
                    Хмм почему вы не преподаёте у нас в Литве :rolleyes: Было бы не плохо :)
                      у меня проблема, в первом списке повторы могут быть :(

                      ExpandedWrap disabled
                        member(X, [X|_]):-!.
                        member(X, [_|Y]):- member(X, Y).
                         
                        general([], _, []).
                        general([X|T], L2, [X|Z]):- member(X, L2), !, general(T,  L2, Z).
                        general([_|T], L4, L2):- general(T, L4, L2).


                      Как это можно было бы локализовать :wall: :whistle:
                      Сообщение отредактировано: xpoint -
                        Что локализовать? В чём заключается задание?
                          Например ?-general([a,b,c,d][b,d,e],R) вернёт R=[b,d]. Тут всё ок, а вот если в первый список добавить ещё повтор например две bb то они и будут две в списке, хоть повтора второго в спискк не будет

                          Добавлено
                          И вот этот пример не понятен find([a,c,a,b,b,b,b,a,g], 4, C). Получаем что C=b. Т.е идём рекурсивно. По два элемента провнряем если истина +1 как не мовпадает считаем кол-во и если >= 4 тогда добавляем в C else обнуляем counter и считаем дальше? Прааильно я понимаю?
                            Цитата xpoint @
                            Например ?-general([a,b,c,d][b,d,e],R) вернёт R=[b,d]. Тут всё ок, а вот если в первый список добавить ещё повтор например две bb то они и будут две в списке, хоть повтора второго в спискк не будет

                            Процедура del2 удаляет из списка все повторы, то есть каждый элемент в возвращаемый список входит ровно один раз. Поэтому после general вызывайте del2
                            general([a,b,b,c,d][b,d,e],R), del2(R,R1).

                            ExpandedWrap disabled
                              %из пустого списка повторы уже удалены
                              del2([],[]).
                              %если голова списка принадлежит хвосту, то отбрасываем её
                              del2([H|T],T1):-
                                member(H,T),!,
                                del2(T,T1).
                              %если голова списка не принадлежит хвосту, делаем ей головой целевого списка
                              del2([H|T],[H|T1]):-
                                del2(T,T1).
                               
                              member(H,[H|T]):-!.
                              member(X,[_|T]):-
                                member(X,T).


                            Добавлено
                            Цитата xpoint @
                            И вот этот пример не понятен find([a,c,a,b,b,b,b,a,g], 4, C). Получаем что C=b. Т.е идём рекурсивно. По два элемента провнряем если истина +1 как не мовпадает считаем кол-во и если >= 4 тогда добавляем в C else обнуляем counter и считаем дальше? Прааильно я понимаю?

                            Я тоже не понимаю. Напишите процедуру find тогда объясню, что она делает.
                              По сути дела если использовпть предикат del2 задание будет совмем не верно выполенно "список R состпвлен из общих элементов двкх списков"

                              А вот что спрашивал в списке S есть K последовательно идущих одинаковых эллементов, которые записывает например в E
                                xpoint, наконец, увидела задания :)
                                Вечером отвечу, сейчас нет времени.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0351 ]   [ 16 queries used ]   [ Generated: 18.07.25, 00:59 GMT ]