Prolog:将元素放在列表中进行十进制到二进制转换

时间:2013-12-07 04:40:39

标签: list prolog

您好我试图修改十进制到二进制转换函数,以便它会在列表中显示结果。我是prolog的新手,我似乎无法让它正常运行。

dec2bin(0,0).
dec2bin(1,1).
dec2bin(N,L):- N>1,X is N mod 2,Y is N//2,  dec2bin(Y,L1), L = [L1|[X]].

然后就是结果:

86 ?- dec2bin(26,L).
L = [[[[1, 1], 0], 1], 0] 

有人可以帮助我理解我做错了什么。 感谢

2 个答案:

答案 0 :(得分:2)

您必须应用一些列表并置,但是当您认为L = [L1|[X]]只是一个数字时,您只需创建两个术语列表并将其与L1嵌套。

如果您将其视为列表,则只需将新创建的X附加到其中,但为此您必须重写递归的基本情况:

dec2bin(0,[0]).
dec2bin(1,[1]).
dec2bin(N,L):- 
    N > 1,
    X is N mod 2,
    Y is N // 2,  
    dec2bin(Y,L1), 
    append(L1, [X], L).

屈服于:

?- dec2bin(26,L).
L = [1, 1, 0, 1, 0] 

其中append/3可以是library predicate或您自己的implementation

答案 1 :(得分:2)

如果你修改你的代码

dec2bin(0,[0]).
dec2bin(1,[1]).
dec2bin(N,L):- 
    N > 1,
    X is N mod 2,
    Y is N // 2,  
    dec2bin(Y,L1),
    L = [X|L1].

你将以相反的顺序得到你的解决方案:

?- dec2bin(26,L).
L = [0, 1, 0, 1, 1] 

不是追加每个位,而是考虑最终反向/ 2,或通过累加器反转顺序

dec2bin(N,L) :- dec2bin(N,[],L).

dec2bin(0,L,[0|L]).
dec2bin(1,L,[1|L]).
dec2bin(N,L,R):- 
    N > 1,
    X is N mod 2,
    Y is N // 2,  
    dec2bin(Y,[X|L],R).