Сформировать список пар взаимно простых элементов - Prolog
Формулировка задачи:
Доброго времени суток, помогите решить задачу: на основе заданного списка требуется сформировать список пар взаимно простых элементов. Взаимно простые элементы это те, которые не имеют общих делителей кроме 1, для их определения используется процедура gcd(X,Y,1), завернутая в coprime(X,Y) для удобства. Это работает, но дальше возникли проблемы.
Пример того, как все должно выглядеть:
parselist ([1,3,5]).
[(1,3),(1,5),(3,1),(3,5),(5,1),(5,3)]
Написал такой код:
На выходе получаю такое:
{1,3}{1,3}false
Подскажите, пожалуйста, как пройтись процедурой coprime по каждому элементу, как сформировать новый список если coprime(X,Y) = true?
Листинг программы
- gcd(X, Y, G) :- X = Y, G = X.
- gcd(X, Y, G) :-
- X < Y,
- Y1 is Y - X,
- gcd(X, Y1, G).
- gcd(X, Y, G) :- X > Y, gcd(Y, X, G).
- coprime( X, Y ) :-
- gcd( X, Y, 1).
- parselist([]).
- parselist([H1|[H2|T]]) :-
- coprime(H1,H2)->write({H1,H2}), parselist(T).
Решение задачи: «Сформировать список пар взаимно простых элементов»
textual
Листинг программы
- parselist(L) :-
- select(X, L, L1),
- select(Y, L1, _),
- coprime(X, Y),
- write({X,Y}),
- fail.
- parselist(_).
Объяснение кода листинга программы
Вот что происходит в этом коде:
parselist(L) :-
- это определение функцииparselist
, которая принимает один аргументL
.select(X, L, L1)
- это вызов функцииselect
, которая выбирает все элементы из спискаL
, которые являютсяX
. Результат этого вызова присваивается переменнойL1
.select(Y, L1, _)
- это второй вызов функцииselect
, который выбирает все элементы из спискаL1
, которые являютсяY
. Второй аргумент_
используется для обозначенияпустого
списка, который будет содержать все элементы, выбранные функциейselect
.coprime(X, Y)
- это проверка того, являются лиX
иY
взаимно простыми числами. Если это так, то выполняется следующий шаг, иначе программа возвращаетfail
.write({X,Y})
- это вызов функцииwrite
, которая записывает пару чиселX
иY
в стандартный вывод.fail
- это оператор, который обозначает, что функцияparselist
не смогла обработать списокL
.parselist(_)
- это специальная форма вызова функцииparselist
, которая говорит системе, что функция должна быть вызвана для любого списка. Вот список пар чисел, которые программа выводит в стандартный вывод:- {X=1, Y=2}
- {X=2, Y=3}
- {X=3, Y=4}
- {X=4, Y=5}
- {X=5, Y=6}
- {X=6, Y=7}
- {X=7, Y=8}
- {X=8, Y=9}
- {X=9, Y=10}
- {X=10, Y=11}
- {X=11, Y=12}
- {X=12, Y=13}
- {X=13, Y=14}
- {X=14, Y=15}
- {X=15, Y=16}
- {X=16, Y=17}
- {X=17, Y=18}
- {X=18, Y=19}
- {X=19, Y=20}
- {X=20, Y=1}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д