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],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,并在其他一些数字系统中进行添加。

    PS:取自这里的代码。

    链接地址: http://www.djcxy.com/p/63995.html

    上一篇: Prolog Binary Addition Issue?

    下一篇: CSS Target Last Paragraph After Heading