我需要編寫一個Prolog謂詞來計算列表中2個二進制數的和。 這些列表已經顛倒了,例如([0,1]基數2)=(2基數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是1.'應該是'is_binary([X]): - X = 1.'或更好,' is_binary([1])。'。術語'X是1'是表達式分配。雖然它恰好工作,但是'=/2'是爲了統一,這就是你想要的。 – lurker 2015-04-01 00:02:15
+1爲非常明智的要求不使用'!/ 0',if-then-else等!這些結構通常會使您的程序非單調且不那麼一般。 – mat 2015-04-01 00:03:21