통일만을 사용한 또 다른 변형입니다.
padZerosPrep(L, [], L).
padZerosPrep(L, [_|T], [0|R]):- padZerosPrep(L, T, R).
padZerosWalk([], [], La, Lb, La, Lb).
padZerosWalk([], [_|_], La, Lb, La, Lb).
padZerosWalk([_|_], [], La, Lb, La, Lb).
padZerosWalk([_|La0], [_|Lb0], [_|La1], [_|Lb1], La, Lb):-
padZerosWalk(La0, Lb0, La1, Lb1, La, Lb).
padZeros(La0, Lb0, La, Lb):-
padZerosPrep(La0, Lb0, La1),
padZerosPrep(Lb0, La0, Lb1),
padZerosWalk(La0, Lb0, La1, Lb1, La, Lb).
그냥 두 목록을 전달하고 목록의 두 번째 쌍은 같은 길이있을 것이라는 점을 기억하십시오
?- padZeros([1,2,3],[4,5,6],A,B).
A = [1, 2, 3],
B = [4, 5, 6]
?- padZeros([1,2,3],[4,5],A,B).
A = [1, 2, 3],
B = [0, 4, 5]
?- padZeros([2,3],[4,5,6],A,B).
A = [0, 2, 3],
B = [4, 5, 6]
?- La=[A,B,C,D], Lb = [1], Lc=[B,I,T], padZeros(La, Lb, La1, Lb1), padZeros(La1, Lc, La2, Lc2), padZeros(Lb1, Lc, Lb2, Lc2).
La = [A, B, C, D],
Lb = [1],
Lc = [B, I, T],
La1 = [A, B, C, D],
Lb1 = [0, 0, 0, 1],
La2 = [A, B, C, D],
Lc2 = [0, B, I, T],
Lb2 = [0, 0, 0, 1]
?- Lc=[A,B,C,D], Lb = [1], La=[B,I,T], padZeros(La, Lb, La1, Lb1), padZeros(La1, Lc, La2, Lc2), padZeros(Lb1, Lc, Lb2, Lc2).
Lc = [A, B, C, D],
Lb = [1],
La = [B, I, T],
La1 = [B, I, T],
Lb1 = [0, 0, 1],
La2 = [0, B, I, T],
Lc2 = [A, B, C, D],
Lb2 = [0, 0, 0, 1]
P.S.을 이 술어를 역순으로 사용하지 마십시오. 하스켈
같은 변형 :
padZeros :: (Num a, Num b) => [a] -> [b] -> ([a], [b])
padZeros a b = walk (zip a b) pa pb where
pa = map (const 0) b ++ a
pb = map (const 0) a ++ b
walk [] a' b' = (a', b')
walk (_:xs) (_:a') (_:b') = walk xs a' b'
브릴리언트, 감사 에드, 나는 그것을 개념화 힘든 시간을 보내고 있었다. 그러나 추가 제로에 대한 두 번째 기본 사례는 중복 된 것으로 생각합니다. – sixtyfootersdude