我如何声明两个列表具有相同的长度?

时间:2014-05-10 21:59:34

标签: prolog

我需要知道如何比较Prolog中两个列表的长度。这就是我到目前为止所做的:

sum(N1,N2) :-
    checklength(N1,N2).

checklength(N1,N2) :-
    L1 is length(N1,What),
    L2 is length(N2,What),
    Comp(L1,L2).

Comp(L1,L2) :-
    L1=:=L2.

3 个答案:

答案 0 :(得分:9)

当然,CapelliC的答案是完美的,但您也可以尝试解决此问题的“标准”方法:

same_length([],[]).
same_length([_|L1],[_|L2]) :- same_length(L1, L2).

答案 1 :(得分:3)

如果您使用的是SWI-Prolog,那么您只需使用same_length/2谓词。

答案 2 :(得分:2)

你可以使用统一:

checklength(N1,N2):-
    length(N1,What),
    length(N2,What).

只有当N1和N2具有相同的长度时,这才会成功。

Btw L1 is length(N1,What)没有意义。 length / 2是谓词,而不是函数。 也就是说,它会成功或失败,但不会“返回”一个值。 Otoh,是/ 2期望算术表达式为右操作数。

修改

checklength(N1,N2,R1,R2):-
    length(N1,L1),
    length(N2,L2),
    (   L1 < L2
    ->  lpad(L1,L2,N1,R1), R2 = N2
    ;   L2 < L1
    ->  lpad(L2,L1,N2,R2), R1 = N1
    ;   (R1,R2) = (N1,N2)
    ).

lpad(A,A,L,L) :- !.
lpad(A,B,L,[0|T]) :- A < B, C is A+1, lpad(C,B,L,T).