Я пытаюсь понять, как сложить вместе два двоичных числа, которые представлены в виде списков. Например: addNumbers([1,0,1], [1,1,0,0], X). должен вернуть X = [1,0,0,0,1].
Мы не вслух используем сокращения(!) для решения этой проблемы. Итак, я знаю, что мне нужно реализовать своего рода сумматор. Прямо сейчас я добавляю цифры, реализованные с необходимыми предикатами:
addDigits(A,B,X,Y) :- myXor(A,B,X), myAnd(A,B,Y).
myAnd(A,B,R) :- A == 1, B == 1, R is 1.
myAnd(A,B,R) :- A == 0, B == 0, R is 0.
myAnd(A,B,R) :- A == 1, B == 0, R is 0.
myAnd(A,B,R) :- A == 0, B == 1, R is 0.
myOr(A,B,R) :- A == 0, B == 0, R is 0.
myOr(A,B,R) :- A == 0, B == 1, R is 1.
myOr(A,B,R) :- A == 1, B == 0, R is 1.
myor(A,B,R) :- A == 1, B == 1, R is 1.
Это правильно возвращает X как сумму двух двоичных цифр и Y как перенос. Теперь я знаю, что мне это нужно для моего сумматора. Теперь, чтобы реализовать addDigits, я застрял. В настоящее время это то, что у меня есть, но не работает. ПРИМЕЧАНИЕ. Подсказка была началом LSB, но в настоящее время я этого не делаю.
addNumbers([HA|TA],[HB|TB],X) :- adder(HA,HB,Cin,Sum,Cout,X),
append(Sum, X, X),
addNumbers(TA,TB,X).
adder(X,Y,Cin,Sum,Cout) :- addDigits(X,Y,Sum1,Carry1),
addDigits(Sum1, Cin, Sum, Carry2),
myOr(Carry1, Carry2, Cout).
Любая помощь/предложения будут оценены.
Ваше здоровье