【发布时间】:2015-03-31 23:08:15
【问题描述】:
我需要编写一个 Prolog 谓词来计算列表中表示的 2 个二进制数的总和。 列表已经反转,例如 ([0,1] base 2) = (2 base 10)。
它应该适用于模式 binary_plus(+,+,-),例如
?- binary_plus([1,1],[1],X).
X = [0,0,1].
以binary_plus(-,-,+)模式为例
?- binary_plus(X,X,[0,1]).
X = [1].
我不允许使用剪切符号、findall、否定或 if-then-else。
这是我的代码:
is_binary([]).
is_binary([X]):- X is 1.
is_binary([X|Xs]):-
append(_,[1],Xs),
member(X,[0,1]),
is_binary(Xs).
binary_plus([],X,X):-
is_binary(X).
binary_plus(X,[],X):-
is_binary(X).
binary_plus([0|Xs],[Y|Ys],[Y|Zs]):-
binary_plus(Xs,Ys,Zs).
binary_plus([1|Xs],[0|Ys],[1|Zs]):-
binary_plus(Xs,Ys,Zs).
binary_plus([1|Xs],[1|Ys],[0|Zs]):-
binary_plus(Xs,[1],Ws),
binary_plus(Ws,Ys,Zs).
我不知道我错在哪里,因为有一些我无法解决的奇怪问题, 因此,如果有人可以帮助我,我将不胜感激。 谢谢。
【问题讨论】:
-
is_binary([X]):- X is 1.应该是is_binary([X]) :- X = 1.或更好,is_binary([1]).。术语X is 1是表达式赋值。虽然碰巧有效,但=/2是为了统一,这就是你想要的。 -
+1 表示不使用
!/0、if-then-else 等非常明智的要求!这些结构通常会使您的程序变得非单调且不那么通用。