Visual Prolog 5.2 Число,представленное списком двоичных разрядов напечатать в виде десятичного числа
Формулировка задачи:
Не могу понять,почему компилятор выдает No solution.Первый раз программирую на языке после теории,не судите строго.
Все,исправил сам.Чо-т очень глупую ошибку совершил,надо было еще подумать.
Решение задачи: «Visual Prolog 5.2 Число,представленное списком двоичных разрядов напечатать в виде десятичного числа»
textual
Листинг программы
domains intl=integer* predicates b2d_(intl,integer,integer) b2d(intl,integer) clauses b2d_([],R,R). b2d_([H|T],R,S) :- R1=R*2+H, b2d_(T,R1,S). b2d(X,R) :- b2d_(X,0,R).
Объяснение кода листинга программы
domains
- определения типов данных, используемых в программе. В данном случае,intl
определен какinteger*
, что означает, что это список целых чисел.predicates
- определения пользовательских функций (предикатов) в программе. В данном случае,b2d_
иb2d
- две версии одной функции, принимающие три аргумента (intl
,integer
,integer
) и два аргумента (intl
,integer
) соответственно.clauses
- определения правил (условий) в программе. В данном случае, есть два правила: a.b2d_([],R,R).
- когда входной список пуст, то результатом будетR
, то есть входной аргумент. b.b2d_([H|T],R,S) :- R1=R*2+H, b2d_(T,R1,S).
- когда входной список не пуст, то естьH
, первый элемент списка, иT
, оставшаяся часть списка. Результатом будетR1
, полученное умножениемR
на 2 и добавлениемH
. Затем вызывается рекурсивно функцияb2d_
для спискаT
и аргументовR1
иS
.b2d(X,R) :- b2d_(X,0,R).
- определение версии функцииb2d
, принимающей два аргумента. Когда второй аргумент равен 0, то естьX
является пустым списком, то результатом будетR
, то есть входной аргумент. В противном случае, вызывается рекурсивно функцияb2d_
для спискаX
, аргументов 0 иR
. Таким образом, данный код представляет собой реализацию функции, преобразующей список двоичных чисел в десятичное число.