Пролог программа со списками и подсписками

Привет, я должен решить проблему в Прологе, которая звучит так: удаляет все подсписки списка, которые увеличиваются. Например, список [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).

просто попытайтесь понять, почему порядок правил также важен в Прологе...

Другие вопросы по тегам