Разность списков (?) Prolog 2.0
Формулировка задачи:
Задача: Переписать из 1 списка во 2 список те элементы, которых нет в 3 списке.
Написала так:
Почему-то ругается на анонимную переменную в первом клозе.
Листинг программы
- DOMAINS
- L=integer*
- X=integer
- PREDICATES
- diz(L,L,L)
- member(X,L)
- CLAUSES
- diz([],_,[]).
- diz([H|T1],L,[H|T2]):- member(H,L), diz(T1,L,T2).
- diz([_|T],L1,L2):- diz(T,L1,L2).
- member(H,[H|_]).
Решение задачи: «Разность списков (?) Prolog 2.0»
textual
Листинг программы
- DOMAINS
- L=integer*
- X=integer
- PREDICATES
- pred(L,L,L)
- member(X,L)
- CLAUSES
- pred([],[],_).
- pred([H|T1],[H|T2],L):- not(member(H,L)),!,
- pred(T1,T2,L).
- pred([_|T],L1,L2):- !, pred(T,L1,L2).
- member(H,[H|_]).
- member(H,[_|T]):- member(H,T).
Объяснение кода листинга программы
domains
- определения доменов:L
- список целых чиселX
- целое число
predicates
- определения предикатов:pred
- предикат, принимающий три аргумента: список, элемент, результат
clauses
- определения правил (условий) для предикатаpred
:- Первое правило: если список пустой, то результат будет пустым списком (
[]
) - Второе правило: если первый элемент списка
H
не содержится в спискеL
, то рекурсивно вызываетсяpred
для оставшегося спискаT1
и нового спискаT2
безH
- Третье правило: если первый элемент списка
H
отсутствует, то рекурсивно вызываетсяpred
для оставшегося спискаT
- Первое правило: если список пустой, то результат будет пустым списком (
member
- предикат, определяющий, является ли элементX
частью спискаL
:- Первое правило: если
X
равен первому элементу спискаH
, то он является членом списка - Второе правило: если
X
не является первым элементом спискаH
, то рекурсивно вызываетсяmember
для оставшегося спискаT
В итоге, данный код реализует рекурсивную функцию для нахождения разности двух списков, исключая повторяющиеся элементы.
- Первое правило: если
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д