我试图弄清楚如何将两个表示为列表的二进制数相加。例如:addNumbers([1,0,1], [1,1,0,0], X)。应该返回 X = [1,0,0,0,1]。
我们不大声使用cuts(!) 来解决这个问题。所以我知道我必须实现一个加法器。现在我已经添加了用它需要的谓词实现的数字:
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 作为 2 个二进制数字的总和,并将 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).
任何帮助/建议将不胜感激。
干杯