Пролог программа со списками и подсписками
Привет, я должен решить проблему в Прологе, которая звучит так: удаляет все подсписки списка, которые увеличиваются. Например, список [1,[2],[3,4],6] становится [1,6]. Пока я пробовал это, но это не работает. Любая помощь, пожалуйста?
domains
el=integer
list=el*
element=integer;list
lista=element*
goal
elim([1,[2],[3],4)],L),
write(L).
predicates
elim(lista,lista)
is_increasing(lista)
is_list(lista)
clauses
is_increasing([A,B|T]) :-
B>A,
is_increasing([B|T]).
is_list([_|_]).
is_list([]).
elim([],[]).
elim([E|Es],[E|Ts]) :-
is_list(E),
is_increasing(E),
elim(Es, Ts).
1 ответ
Попытайтесь модулировать ваш код: сначала напишите is_increasing/1. Поскольку создается впечатление, что список из 1 элемента увеличивается, вы можете сделать так же просто, как
is_increasing([A,B|T]) :- B > A, is_increasing([B|T]).
is_increasing([_]).
затем вы можете использовать его для удаления элементов при копировании. Остерегайтесь проверить, что элемент является списком перед вызовом. Вот возможное определение
is_list([_|_]).
is_list([]).
редактировать
есть плохая декларация, как советует mbratch
element=i(integer);l(list)
должно быть
element=integer;list
Кроме того, вы забыли is_increasing([_]).
и в любом случае вы вообще не используете is_list или is_increasing.
Правило исключения списков, конечно, следует читать
elim([E|Es], Ts) :- is_list(E), is_increasing(E), elim(Es, Ts).
просто добавьте базовый случай и копию. то есть elim - это предикат из 3 статей...
отредактируйте отдельно вышеприведенное правило, вам нужен только базовый вариант
elim([],[]).
и копия
elim([E|Es],[E|Ts]) :- elim(Es, Ts).
просто попытайтесь понять, почему порядок правил также важен в Прологе...