Здравствуйте, fsssl_dm, Вы писали:
_>Есть небольшое задание: написать предикат проверки списка. Список имеет следующий вид: _>
_>[a,a,a,a,…,a,b,…,b]
_>
_>Предполагается использование Arity Prolog, но, наверное, это не имеет особого значения.
Честно говоря, не совсем понятно, что нужно сделать, под вид [a,a,a,a,…,a,b,…,b] можно подогнать много ограничений (например, список заканчивается чередующейся последовательностью a,b,a,b,a,...). Если телепатия меня не подвела, и список должен начинаться с непустой последовательности элементов X любой длины, а заканчиваться непустой последовательностью элементов Y любой длины, причем X<>Y, то можно так (работает на SWI-Prolog. DISCLAIMER: на Прологе и пишу крайне редко и не более 10 строчек, код предоставлен AS IS):
Здравствуйте, fsssl_dm, Вы писали: _>Есть небольшое задание: написать предикат проверки списка. Список имеет следующий вид:
Я вот что придумал.
% 1. пролетаем первую часть одинаковых букв
first(A, [A|T]) :-
first(A, T).
% 2. начинается вторая часть уже других одинаковых букв,
% при этом А запоминается, что бы исключить [a,a,...,a]
first(A, [B|T]) :-
not(A=B),second(A, B, T).
% 3. пролетаем вторую часть
second(A, B, [B|T]) :-
not(A=B),second(A, B, T).
% 4. конецц
second(A, B, []) :-
not(A=B).
% 0. процедура проверки списка на соотвесттвие шаблону
%[a, a,... , a, b, b,... ,b]
check(L) :-
first(_,L).
Вроде работает. SWI-Prolog.
Т.к. пролог использую ооооочень редко, не могли бы знающие люди прокомментировать мой код. Например мне не очень нра вятся not(A=B), однако если это не поставить во 2 предложении — работает неправильно (на наборе [a,a,...,a]). А раз уж поставил в одном месте, то поставил и в остальных, где А != В
ОписАлся. O>...однако если это не поставить во 2 предложении ...
в 4 предложении!
Хотя если поменять местами 2 и 1 то и тут будет необходимость в A!=B, а ведь от перестановки предложений не должен меняться декларативный смысл программы, как я понимаю
Здравствуйте, oziro, Вы писали:
O>Здравствуйте, fsssl_dm, Вы писали:
Можно немножко упростить. second не нуждается в знании A.
А поскольку проверка на равенство уже выполнялась в первой кляузе ( ), то достаточно сделать отсечку вместо повторной проверки с not.
Здравствуйте, Кодт, Вы писали:
К>Можно немножко упростить. second не нуждается в знании A. К>А поскольку проверка на равенство уже выполнялась в первой кляузе ( ), то достаточно сделать отсечку вместо повторной проверки с not.
Да, спасибо большое, никак я отсечкой не научусь нормально пользоваться, read only
С учетом пожеланий swi-prolog'a (варнинги на неиспользуемые переменные):