Пролог домашнее задание: как разобрать список «битов», представляющих числовое значение в десятичном представлении? - PullRequest
2 голосов
/ 04 марта 2010

Хорошо, у меня есть еще один вопрос по проблеме домашнего задания, с которым я борюсь.Проблема заключается в следующем:

Напишите программу Prolog, которая возьмет список, представляющий биты двоичного числа, и вернет десятичное значение целого числа, которое представляет список.

Пример:valueof ([1,1,0,1], Х).X = 13

Итак, вот что у меня есть:

valueOf(List, X) :- setup(List, [], X).
setup([H|T], [Y|H], X) :- setup(T,Y,X).
setup([], Y, X) :- count(Y, X, 0).
count([], _, _).
count([H|T], X, Count) :- NewCount is Count + 1, NewX is X + (H*2^Count),
                          count(T,NewX,NewCount).

Еще раз, я ценю любую помощь, мне действительно кажется, что я борюсь с этим прологом.Благодаря.

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

Ваш алгоритм выглядит слишком сложным; попробуйте что-нибудь вроде этого:

  • базовый регистр: список из одной цифры, возврат цифры
  • рекурсивный регистр: возвращает последнюю цифру плюс 2 раза результат списка с удаленной последней цифрой.

Поскольку это домашнее задание, я оставлю детали реализации за вами.

1 голос
/ 04 марта 2010

Я бы сказал, что я не согласен с выбором базового варианта Карлом.Мы должны обработать случай пустого списка, и лучше не иметь несколько типов «базовых случаев».Аналогия с «базовым» случаем - это случай с «дном» рекурсии, и мы все знаем, что у вещей есть только одно дно или основание.

Поэтому я бы предложил:

  • базовый случай:
    • пустой список со значением «ноль» (0)
    • в этом случае завершается рекурсия, поэтому необходимо скопировать любое накопленное значение в выходной параметр.
  • исходный случай: еще не накопив никаких цифр, переменная аккумулятора будет равна нулю (0).
  • рекурсивный случай: цифра, проверенная в каждой рекурсии, накапливается в аккумуляторе

Код пролога будет выглядеть так:

% Initial value of accumulator is zero (0).
valueOf( L, X) :- value_of_accumulation( L, 0, X).

% Base case:
% When there are no more digits to process, the output value (3rd param)
% is unified with the accumulator (2nd param)
value_of_accumulation( [], A, A).

% The recursive step.  There is a digit (B) to process here.  T is a temporary
% which holds the value of the accumulator "passed down" to the next case
% and, ultimately, to the base case after possible more accumulations.  A holds
% the previously-accumulated value derived from more-significant bits, already
% processed in previous recursions.  This clause is invoked once for each bit.
% Implicitly, the invocations of this clause generate a "count" but there is no
% actual use of the count when accumulating the bits.  Each bit is accumulated
% without knowledge of whether subsequent bits follow.
value_of_accumulation( [B | L], A, X) :-
    B >= 0,
    B =< 1,
    T is % fill this in with math, a function of bit B and previously-accumulated bits A,
    value_of_accumulation( L, %fill this in with prolog understanding.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...