Мне нужно написать предикат Prolog, который вычисляет сумму 2 двоичных чисел, представленных в списке. Списки уже перевернуты, например ([0,1] base 2) = (2 base 10).
Он должен работать с режимом binary_plus (+, +, -), например
?- binary_plus([1,1],[1],X).
X = [0,0,1].
и с режимом binary_plus (-, -, +), например
?- binary_plus(X,X,[0,1]).
X = [1].
Мне запрещено использовать знак сокращения, findall, отрицание или if-then-else.
Вот мой код:
is_binary([]).
is_binary([X]):- X is 1.
is_binary([X|Xs]):-
append(_,[1],Xs),
member(X,[0,1]),
is_binary(Xs).
binary_plus([],X,X):-
is_binary(X).
binary_plus(X,[],X):-
is_binary(X).
binary_plus([0|Xs],[Y|Ys],[Y|Zs]):-
binary_plus(Xs,Ys,Zs).
binary_plus([1|Xs],[0|Ys],[1|Zs]):-
binary_plus(Xs,Ys,Zs).
binary_plus([1|Xs],[1|Ys],[0|Zs]):-
binary_plus(Xs,[1],Ws),
binary_plus(Ws,Ys,Zs).
Я не знаю, в чем я ошибаюсь, потому что есть некоторые странные проблемы, которые я не могу решить, поэтому, если бы кто-то мог мне помочь, я был бы признателен. Спасибо.
is_binary([X]):- X is 1.
должно бытьis_binary([X]) :- X = 1.
или лучше,is_binary([1]).
. ТерминX is 1
- это присвоение выражения. Несмотря на то, что это работает,=/2
предназначен для объединения, а это то, что вам нужно. - person lurker   schedule 01.04.2015!/0
, if-then-else и т. Д.! Эти конструкции обычно делают ваши программы немонотонными и менее общими. - person mat   schedule 01.04.2015