Десятичное число, представленное списком десятичных цифр, представить списком двоичных разрядов - Prolog
Формулировка задачи:
Всем доброго времени суток, необходимо в Visual Prolog представить десятичное число в виде списка его цифр, а затем каждую цифру преобразовать в двоичную систему счисления. С первой частью задания все получается, несмотря на то что список забивается наоборот (из-за того, что mod получает остатки справа-налево).
Возникла идея преобразовывать каждую десятичную цифру в списке в список из двоичных разрядов. Например, число 16, представленное списком [6, 1] (наоборот), преобразуется в [[1, 1, 0], [1]] , но не очень понимаю, как представить это в виде кода, поэтому прошу вашей помощи
Решение задачи: «Десятичное число, представленное списком десятичных цифр, представить списком двоичных разрядов»
textual
Листинг программы
domains int=integer intl=int* intll=intl* predicates app(intl,intl,intl) d10(int,intl) d2(int,intl) m2(int,intl) d10_2(intl,intll) task(int,intll) clauses app([],X,X). app([H|T],X,[H|Y]) :- app(T,X,Y). d10(N,[N]) :- N<10, !. d10(N,R) :- N1=N div 10, M=N mod 10, d10(N1,R1), app(R1,[M],R). d2(N,[N]) :- N<2, !. d2(N,R) :- N1=N div 2, M=N mod 2, d2(N1,R1), app(R1,[M],R). m2(0,[0]). m2(1,[1]). m2(2,[1,0]). m2(3,[1,1]). m2(4,[1,0,0]). m2(5,[1,0,1]). m2(6,[1,1,0]). m2(7,[1,1,1]). m2(8,[1,0,0,0]). m2(9,[1,0,0,1]). d10_2([],[]). d10_2([H|T],[Q|R]) :- m2(H,Q), d10_2(T,R). task(N,R) :- d10(N,LN), d10_2(LN,R).
Объяснение кода листинга программы
В этом коде используется язык программирования Prolog. Вот список описаний работы программы:
- Представление десятичного числа в виде списка десятичных цифр:
domains
определяют типы данных для переменных:int
- целочисленный,intl
- список целочисленных,intll
- список списков целочисленных.predicates
определяют функции, которые могут быть проверены на истинность:app(intl,intl,intl)
- рекурсивная функция для объединения двух списков.d10(int,intl)
- преобразует десятичное число в список десятичных цифр.d2(int,intl)
- преобразует двоичное число в список десятичных цифр.m2(int,intl)
- генерирует список десятичных цифр для двоичного числа.d10_2(intl,intll)
- преобразует список десятичных цифр в список списков десятичных цифр.task(int,intll)
- основная функция, которая преобразует десятичное число в список списков десятичных цифр.clauses
определяют конкретные значения функций:app([],X,X).
- базовый случай для пустого списка.app([H|T],X,[H|Y]) :- app(T,X,Y).
- рекурсивный случай для непустого списка.d10(N,[N]) :- N<10, !.
- базовый случай для чисел меньше 10.d10(N,R) :- N1=N div 10, M=N mod 10, d10(N1,R1), app(R1,[M],R).
- рекурсивный случай для чисел больше 9.d2(N,[N]) :- N<2, !.
- базовый случай для чисел меньше 2.d2(N,R) :- N1=N div 2, M=N mod 2, d2(N1,R1), app(R1,[M],R).
- рекурсивный случай для чисел больше 1.m2(0,[0]).
- базовый случай для числа 0.m2(1,[1]).
- базовый случай для числа 1.m2(2,[1,0]).
- базовый случай для числа 2.m2(3,[1,1]).
- базовый случай для числа 3.m2(4,[1,0,0]).
- базовый случай для числа 4.m2(5,[1,0,1]).
- базовый случай для числа 5.m2(6,[1,1,0]).
- базовый случай для числа 6.m2(7,[1,1,1]).
- базовый случай для числа 7.m2(8,[1,0,0,0]).
- базовый случай для числа 8.m2(9,[1,0,0,1]).
- базовый случай для числа 9.d10_2([],[]).
- базовый случай для пустого списка.d10_2([H|T],[Q|R]) :- m2(H,Q), d10_2(T,R).
- рекурсивный случай для непустого списка.task(N,R) :- d10(N,LN), d10_2(LN,R).
- основная функция, которая преобразует десятичное число в список списков десятичных цифр.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д