Prolog-二进制加法? [英] Prolog - Binary addition?

查看:128
本文介绍了Prolog-二进制加法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要编写一个Prolog谓词,该谓词计算列表中表示的2个二进制数的总和。
列表已被反转,例如([0,1]以2为底= = 2以10为底。)

I need to write a Prolog predicate which calculate the sum of 2 binary numbers represented in list. The lists are already reversed, for example ([0,1] base 2) = (2 base 10).

它应与binary_plus( +,+,-),例如

It should work with mode binary_plus(+,+,-), for example

?- binary_plus([1,1],[1],X).
X = [0,0,1].

例如,使用模式binary_plus(-,-,+)

and with mode binary_plus(-,-,+), for example

?- binary_plus(X,X,[0,1]).
X = [1].

不允许使用剪切符号,findall,否定或if-

Im not allowed using cut sign,findall,negation,or 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).

我不知道我错了,因为有些无法解决的奇怪问题,
,所以如果有人可以帮助我,我将不胜感激。
谢谢。

I dont know where i'm wrong because there are some strange issues that i cant solve, so if someone could help me i would appreciate it. Thanks.

推荐答案

在这里,我对二进制加法一无所获。我了解您不要使用clpfd:

Here my take on binary-addition-without-anything. I understand that you are not to use clpfd:

binary_plus(A,B,C) :- binary_plus_0(A,B,C).

binary_plus_0([],    [],    []).
binary_plus_0([],    [B|Bs],[B|Bs]).
binary_plus_0([A|As],[],    [A|As]).
binary_plus_0([A|As],[B|Bs],[C|Cs]) :- binary_plus_0(A,B,C,As,Bs,Cs).

binary_plus_0(0,0,0,As,Bs,Cs) :- binary_plus_0(As,Bs,Cs).
binary_plus_0(0,1,1,As,Bs,Cs) :- binary_plus_0(As,Bs,Cs).
binary_plus_0(1,0,1,As,Bs,Cs) :- binary_plus_0(As,Bs,Cs).
binary_plus_0(1,1,0,As,Bs,Cs) :- binary_plus_1(As,Bs,Cs).

binary_plus_1([],    [],    [1]).
binary_plus_1([],    [B|Bs],Cs)     :- binary_plus_0([1],[B|Bs],Cs).
binary_plus_1([A|As],[],    Cs)     :- binary_plus_0([A|As],[1],Cs).
binary_plus_1([A|As],[B|Bs],[C|Cs]) :- binary_plus_1(A,B,C,As,Bs,Cs).

binary_plus_1(0,0,1,As,Bs,Cs) :- binary_plus_0(As,Bs,Cs).
binary_plus_1(0,1,0,As,Bs,Cs) :- binary_plus_1(As,Bs,Cs).
binary_plus_1(1,0,0,As,Bs,Cs) :- binary_plus_1(As,Bs,Cs).
binary_plus_1(1,1,1,As,Bs,Cs) :- binary_plus_1(As,Bs,Cs).

这篇关于Prolog-二进制加法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆