我需要考虑NUM1
和ANS
以及Num2 & ANS
的长度差异,并将零等于长度与NUM1
和{{1}的差异}。我这样做很麻烦。
NUM2
答案 0 :(得分:3)
这使用Prolog if-then-else
模式来检查两个列表的长度。有两个输出列表,如果长度相同则与输入列表相同,或者一个将是前缀为零的两个列表中较短的一个,以匹配另一个列表的长度。
make_same_length(List1, List2, NewList1, NewList2) :-
length(List1, Len1),
length(List2, Len2),
( Len1 = Len2
-> NewList1 = List1,
NewList2 = List2
; Len1 > Len2
-> NumZeroes is Len1 - Len2,
prepend_zeroes(List2, NumZeroes, NewList2),
List1 = NewList1
; NumZeroes is Len2 - Len1,
prepend_zeroes(List1, NumZeroes, NewList1),
List2 = NewList2
).
prepend_zeroes(List, NumZeroes, PadList) :-
length(Zeroes, NumZeroes), % Uninstantiated list of length NumZeroes
maplist(=(0), Zeroes), % Unify each element of Zeroes with 0
append(Zeroes, List, PadList). % Prepend the zeroes to List
一些琐碎的测试案例:
| ?- make_same_length([a,b,c], [d,e,f,g], A, B).
A = [0,a,b,c]
B = [d,e,f,g]
yes
| ?- make_same_length([a,b,c], [d,e], A, B).
A = [a,b,c]
B = [0,d,e]
yes
| ?- make_same_length([a,b], [c,d], A, B).
A = [a,b]
B = [c,d]
yes
| ?-
答案 1 :(得分:3)
如果列表Out
中的所有列表都是列表In
中的零填充列表,则谓词的代码为true:
same_length_padded_lists(In, Out) :-
findall(Length, (nth1(_,In,List), length(List, Length)), Lengths),
max_list(Lengths, Max),
length(In, Lists),
findall(NewList, (between(1, Lists, Index), length(NewList, Max), nth1(Index, In, OL), append(Padding, OL, NewList), maplist(=(0), Padding)), Out).
示例输入和输出:
?- same_length_padded_lists([[1,2], [1,2,3], [1], [5,3]], X).
X = [[0, 1, 2], [1, 2, 3], [0, 0, 1], [0, 5, 3]].
OP的问题:
?- same_length_padded_lists([[T,W,O], [T,W,O], [F,O,U,R]], X).
X = [[0, _G6258, _G6261, _G6264], [0, _G6243, _G6246, _G6249], [_G6225, _G6228, _G6231, _G6234]].
如您所见,您可以同时使用零填充任意数量的列表。
答案 2 :(得分:2)
这里的解决方案与@ lurker&s没有本质的区别。有两个主要区别:
zero_equalized_list/3
来减少代码中显示的条件结构的数量。p(L1, L2, A, Zeros_L1, Zeros_L2) :-
length(A, Len),
zero_equalized_list(L1, Len, Zeros_L1),
zero_equalized_list(L2, Len, Zeros_L2).
zero_equalized_list(L, TargetLen, Zeros_L) :-
length(L, Len),
( TargetLen > Len
-> N is TargetLen - Len,
n_zeros_prepended(N, L, Zeros_L)
; Zeros_L = L
).
n_zeros_prepended(N, L, Zeros_L) :-
length(Zeros, N),
maplist(=(0), Zeros),
append(Zeros, L, Zeros_L).
2次测试:
当前两个参数比第三个参数短时:
?- p([1,2,3,4], [1,2,3], [1,2,3,4,5,6], X, Y).
X = [0, 0, 1, 2, 3, 4],
Y = [0, 0, 0, 1, 2, 3].
当前两个参数长于第三个时:
?- p([1,2,3,4], [1,2,3], [1,2,3], X, Y).
X = [1, 2, 3, 4],
Y = [1, 2, 3].