
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет, вот играюсь со списками в прологе
И вот решил спросить почему у меня не получается, того что я ожидаю от пролога ![]() ![]() has(X,[_|Y]) :- has(X,Y). % если элемент хвоста равен искомому элементу значение будет «истина» Допустим мы берём элемент и список. В конечном результате у нас false ![]() ![]() ?- has(2,[1,2,3]). |
Сообщ.
#2
,
|
|
|
не хватает граничного условия рекурсии.
% искомый элемент совпал с головой списка has(H,[H|_]). %искомый элемент содержится в хвосте списка has(X,[_|T]):- has(X,T). |
Сообщ.
#3
,
|
|
|
Цитата Swetlana @ не хватает граничного условия рекурсии. % искомый элемент совпал с головой списка has(H,[H|_]). %искомый элемент содержится в хвосте списка has(X,[_|T]):- has(X,T). Вы Светлана как всегда на высоте, а я вот хочу понять списки и написать програмки. ну пока что туго выходит ![]() Добавлено Суть такова проверить лист, все ли цифры у нас стоят по порядку. Т.е как я понимаю. Берём лист, отсекаем Head, Tail дальше сравниваем Head < Tail, дальше с отсатка Tail дальше делим Head, Tail и так проверяем пока нету в списке Head > Tail и как только первый находим делаем отсечение ! и пишем faise |
Сообщ.
#4
,
|
|
|
Может, вот это поможет?
Прикреплённый файл ![]() |
Сообщ.
#5
,
|
|
|
мда чего-то не распечатывает линукс файлы с русским именем, сейчас попробую через терминал
Добавлено Всё распаковал иду читать спасибо |
Сообщ.
#6
,
|
|
|
Цитата Суть такова проверить лист, все ли цифры у нас стоят по порядку. %в пустом списке всё в порядке check([]). %в одноэлементном тоже check([X]). % рекурсивное правило для списка хотя бы из двух элементов check([X,Y|T]):- X<=Y, check(T). |
Сообщ.
#7
,
|
|
|
мда задачки простые а я вот читаю, по кускам со всех сайтов и пока не понял.
иду почитаю и постараюсь вникнуть ![]() |
Сообщ.
#8
,
|
|
|
Идея простая. Если в списке выделяем голову, то имеем граничное условие для пустого списка и рекурсивное правило для непустого. Обрабатываем первый элемент, для хвоста вызываем рекурсию.
В вашей задаче нужно было выделить два первых элемента [X,Y|T], поэтому получилось два граничных условия - одно для обработки пустого списка, второе - для одноэлементного. |
Сообщ.
#9
,
|
|
|
Хмм почему вы не преподаёте у нас в Литве
![]() ![]() |
Сообщ.
#10
,
|
|
|
у меня проблема, в первом списке повторы могут быть
![]() ![]() ![]() 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). Как это можно было бы локализовать ![]() ![]() |
Сообщ.
#11
,
|
|
|
Что локализовать? В чём заключается задание?
|
Сообщ.
#12
,
|
|
|
Например ?-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 и считаем дальше? Прааильно я понимаю? |
Сообщ.
#13
,
|
|
|
Цитата 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). ![]() ![]() %из пустого списка повторы уже удалены 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 тогда объясню, что она делает. |
Сообщ.
#14
,
|
|
|
По сути дела если использовпть предикат del2 задание будет совмем не верно выполенно "список R состпвлен из общих элементов двкх списков"
А вот что спрашивал в списке S есть K последовательно идущих одинаковых эллементов, которые записывает например в E |
Сообщ.
#15
,
|
|
|
xpoint, наконец, увидела задания
![]() Вечером отвечу, сейчас нет времени. |