【发布时间】:2012-09-23 04:27:36
【问题描述】:
我有这个作业,我必须用 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],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 时,在某些条件下(仍在尝试找出它们),似乎没有返回任何结果。但我似乎无法找到我的错误。如果有人能告诉我会很高兴我做错了什么。
【问题讨论】:
-
而不是 add([HX|TX],[HY|TY], Z) :- HX = 1, HY = 1, ..., 我猜是 add([1|TX], [1|TY], Z) :- 会更优雅。