List 序言:将元素放入列表中进行十进制到二进制的转换

List 序言:将元素放入列表中进行十进制到二进制的转换,list,prolog,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] 有人能帮我理解我做错了什么吗。 感谢你必须应用一些链表

您好,我试图修改一个十进制到二进制的转换函数,这样它就可以在列表中显示结果。我是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] 
有人能帮我理解我做错了什么吗。
感谢

你必须应用一些链表连接,但是你只需创建两个术语表,并将它们嵌套为<代码> 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
可以是a或您自己的。

如果您修改代码

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,或者用累加器< /P>反转顺序。

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).

我不认为这个子句是非常有用的
dec2bin(0,L,[0 | L])
@joel76,如果没有这个子句,或者用什么东西来代替它,
dec2bin(0,L)。
将失败。