Работа со списками - Prolog (226925)
Формулировка задачи:
Определить,имеется ли в списке хотя бы одна пара одинаковых элементов.
Решение задачи: «Работа со списками»
textual
Листинг программы
domains int=integer intl=int* predicates memb(int,intl) has_dup(intl) clauses memb(_,[]) :- fail. memb(H,[H|_]) :- !. memb(H,[_|T]) :- memb(H,T). has_dup([]) :- fail. has_dup([H|T]) :- memb(H,T), !. has_dup([_|T]) :- has_dup(T).
Объяснение кода листинга программы
domains- определяет типы данных для переменных. В данном случае,intэто целочисленный тип, аintlэто список целочисленных значений.predicates- определяет функции-предикаты, которые могут быть использованы в программе. В данном случае,membэто предикат, который проверяет наличие элемента в списке, аhas_dupэто предикат, который проверяет наличие дубликатов в списке.clauses- определяет правила, которые определяют поведение программы. В данном случае, для предикатаmembопределены два правила: первое правило говорит о том, что если пустой список ([]) передается в качестве первого аргумента, то нужно вызвать ошибку (fail), а второе правило говорит о том, что если первый аргумент равен голове списка (H), а второй аргумент это список, в которомHстоит в начале ([H|_]), то предикат должен возвращатьtrue(что обозначается символом!). Третье правило говорит о том, что если первый аргумент равен голове списка (H), а второй аргумент это список, в которомHстоит в конце ([_|T]), то нужно вызывать предикатmembдляHиT.- Для предиката
has_dupопределены два правила: первое правило говорит о том, что если пустой список ([]) передается в качестве первого аргумента, то нужно вызывать ошибку (fail), а второе правило говорит о том, что если первый аргумент это список, в котором есть дубликаты ([H|T]), то предикат должен возвращатьtrue(что обозначается символом!). Третье правило говорит о том, что если первый аргумент это список, в котором нет дубликатов ([_|T]), то нужно вызывать предикатhas_dupдляT.