Binary Prolog二进制加法问题?
我有一份作业,我必须用Prolog编写。要求是编写一段进行二进制加法的代码,例如:Binary Prolog二进制加法问题?,binary,prolog,Binary,Prolog,我有一份作业,我必须用Prolog编写。要求是编写一段进行二进制加法的代码,例如: ?- add([1,0,1],[1,1],X). X = [0,0,0,1] 因此,这是我提出的代码: add([],[], _). add([],Y, Z) :- append([], Y, Z). add(X,[], Z) :- append(X,[],Z). add([HX|TX],[HY|TY], Z) :- HX = 1, HY = 1, add(TX,TY, Z1),
?- add([1,0,1],[1,1],X).
X = [0,0,0,1]
因此,这是我提出的代码:
add([],[], _).
add([],Y, Z) :- append([], Y, Z).
add(X,[], Z) :- append(X,[],Z).
add([HX|TX],[HY|TY], Z) :-
HX = 1,
HY = 1,
add(TX,TY, Z1),
add([1],Z1, Z2),
append([0],Z2,Z),!.
add([HX|TX],[HY,TY], Z) :-
HX = 0,
HY = 1,
add(TX,TY,Z1),
append([1],Z1, Z),!.
add([HX|TX],[HY|TY], Z) :-
HX = 1,
HY = 0,
add(TX,TY,Z1),
append([1],Z1, Z),!.
add([HX|TX],[HY,TY], Z) :-
HX = 0,
HY = 0,
add(TX,TY,Z1),
append([0],Z1, Z),!.
它似乎做了我所需要的,但是,它有一些奇怪的问题,我无法理解,因此,如果有人能指导我做了什么错事,我会很高兴
结果:
?- add([1,1,1,1], [1,1],Z).
Z = [0, 1, 0, 0, 1]. % this is correct
?- add([1], [1],Z).
Z = [0, 1]. % this is correct
?- add([1,1,0,1], [1,1],Z).
Z = [0, 1, 1, 1]. % this is correct
?- add([1],[0],Y).
Y = [1|_G7100]. % there is an error here, but its not the big issue.
?- add([1,0,1], [1,1],Z).
false. % no results are returned.
104 ?- add([0], [1],Z).
false. % no results returned either
问题:
每当第一个二进制列表中出现0时,在某些情况下(仍在试图找出它们),似乎不会返回任何结果。但我似乎找不到我的错误。如果有人能告诉我我做错了什么,我会很高兴的。有3个错误:
- 规则1:应该是
而不是add([],[],[])。
。对于等长列表,此操作失败add([],[],[])。
- 规则5和规则7:应该是
而不是add([HX | TX],[HY | TY],Z)
。当第二个列表(add([HX | TX],[HY,TY],Z)
)包含的元素少于两个时,此操作失败Y
修复这些问题,您的代码应该运行良好:请参阅。我看到您使用了7种不同的规则,因为您使用了二进制算术 在规则之内。您可以使用6个不同的规则和一个开始规则 详情如下:
add2(AL, BL, CL) :-
add2(AL, BL, 0, CL).
add2([A | AL], [B | BL], Carry, [C | CL]) :-
X is (A + B + Carry),
C is X rem 2,
NewCarry is X // 2,
add2(AL, BL, NewCarry, CL).
add2([], BL, 0, BL) :- !.
add2(AL, [], 0, AL) :- !.
add2([], [B | BL], Carry, [C | CL]) :-
X is B + Carry,
NewCarry is X // 2,
C is X rem 2,
add2([], BL, NewCarry, CL).
add2([A | AL], [], Carry, [C | CL]) :-
X is A + Carry,
NewCarry is X // 2,
C is X rem 2,
add2([], AL, NewCarry, CL).
add2([], [], Carry, [Carry]).
以下是一些运行示例:
?- add2([1,1,1,1], [1,1],Z).
Z = [0,1,0,0,1]
?- add2([1], [1],Z).
Z = [0,1]
?- add2([1,1,0,1], [1,1],Z).
Z = [0,1,1,1]
?- add2([1],[0],Y).
Y = [1]
?- add2([1,0,1], [1,1],Z).
Z = [0,0,0,1]
?- add2([0], [1],Z).
Z = [1]
上述解决方案的主要优点是,add2/4和
您可以替换//2和rem 2,并在其他一些函数中进行加法
还有数字系统
附言:代码取自。如果不加([HX | TX],[HY | TY],Z):-HX=1,HY=1,…,我想加([1 | TX],[1 | TY],Z):-会更优雅。