在Prolog中将差异零添加到列表中

时间:2014-05-10 23:50:06

标签: prolog

我需要考虑NUM1ANS以及Num2 & ANS的长度差异,并将零等于长度与NUM1和{{1}的差异}。我这样做很麻烦。

NUM2

3 个答案:

答案 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没有本质的区别。有两个主要区别:

  1. 我认为它准确地解决了你的问题的具体细节,而潜伏者的答案显示了如何解决这个问题(我发现你的描述很难理解,我花了一些时间来解析。我不是&# 39;不知道潜伏者是否有类似的麻烦或只是做出明智的教学选择)。
  2. 我使用额外的谓词zero_equalized_list/3来减少代码中显示的条件结构的数量。

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