Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 我如何声明两个列表具有相同的长度?_Prolog - Fatal编程技术网

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

Prolog 我如何声明两个列表具有相同的长度?,prolog,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. 您可以使用统一: checklength(N1,N2):- length(N1,What)

我需要知道如何在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.

您可以使用统一:

checklength(N1,N2):-
    length(N1,What),
    length(N2,What).
只有当N1和N2具有相同的长度时,此操作才会成功

顺便说一句,L1是长度(N1,什么)没有意义。length/2是一个谓词,而不是一个函数。 也就是说,它会成功或失败,但不会“返回”值。 Otoh,is/2需要一个算术表达式作为右操作数

编辑

校验长度(N1、N2、R1、R2):-
长度(N1,L1),
长度(N2,L2),
(L1lpad(L1,L2,N1,R1),R2=N2
;L2lpad(L2,L1,N2,R2),R1=N1
;(R1,R2)=(N1,N2)
).
lpad(A,A,L,L):-!。
lpad(A,B,L[0 | T]):-A
当然,Capelical的答案是完美的,但您也可以尝试处理此问题的“标准”方法:

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

如果您使用的是SWI Prolog,那么您可以简单地使用
same_length/2
谓词。

我想做的不仅仅是比较长度,如果长度不相等,那么我想在列表的开头加零。因此,我需要将大小存储在某个位置,然后附加那么多zeros@user3342812你的意思是在列表前加上零吗?@user3342812:好的,也许你应该在问题中提到你的愿望。。。无论如何,请参阅我的编辑,以获取一种可能的方法…
same_length/2
不是内置谓词。它是一个库谓词,它的库正在自动加载。您始终可以使用标准的
谓词属性/2
谓词来检查谓词的属性,包括
内置的
samelelength/2
是比
checklength/2
更好的名称。比这两个名称都好得多的是<代码> SAMEYLIME/2 。您的解决方案具有比CAPELICS解决方案更好的终止性能:考虑<代码> SAMEL长度(L,[])< /代码>
same_length([],[]).
same_length([_|L1],[_|L2]) :- same_length(L1, L2).