Десятичное число, представленное списком десятичных цифр, представить списком двоичных разрядов - 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. Вот список описаний работы программы:

  1. Представление десятичного числа в виде списка десятичных цифр:
    • 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). - основная функция, которая преобразует десятичное число в список списков десятичных цифр.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы