リストとして表される 2 つの 2 進数を加算する方法を見つけようとしています。例: addNumbers([1,0,1], [1,1,0,0], X)。X = [1,0,0,0,1] を返す必要があります。
この問題を解決するためにカット (!) を使用することはあまりありません。したがって、ある種の加算器を実装する必要があることはわかっています。現在、必要な述語で実装された Digits を追加しています。
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).
ヘルプ/提案をいただければ幸いです。
乾杯