Prolog二进制加法问题?

use*_*809 7 binary prolog

我有这篇文章,我必须在Prolog中编写.要求是编写一段代码来执行二进制加法,例如:

?- add([1,0,1],[1,1],X).
X = [0,0,0,1]
Run Code Online (Sandbox Code Playgroud)

所以,这是我提出的代码:

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),!.
Run Code Online (Sandbox Code Playgroud)

它似乎做了我需要的东西,然而,它有一些我无法理解的奇怪问题,所以如果有人可以指导我做错了什么,我会很高兴的.

结果:

?- 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
Run Code Online (Sandbox Code Playgroud)

问题:每当第一个二进制列表中似乎有0时,在某些条件下(仍然试图弄清楚它们),似乎没有返回结果.但我似乎无法找到我的错误.如果有人会很高兴可以告诉我我做错了什么.

060*_*002 3

有3个错误:

  • 规则#1:应该用add([],[],[]).代替add([],[], _).. 对于等长列表,这会失败。
  • 规则 #5 和 #7:应该add([HX|TX],[HY|TY], Z)代替add([HX|TX],[HY,TY], Z). 当第二个列表 ( Y) 包含少于两个元素时,此操作会失败。

修复这些问题,您的代码应该运行良好:请参阅此处