列表中的 Prolog 列表

Prolog lists inside the lists

我是 Prolog 的新手,我想要实现的是定义包含自然数列表的类似塔的类型。每个“楼层”应该有相同数量的“公寓”,我不知道如何查看。

假设“类型”是指可以保存数据的结构,我建议使用列表列表,如下所示:

[[101,102,103],[201,202,203],[301,302,303]]

所以现在您需要检查每个“楼层”(子列表)是否具有相同数量的元素。计算列表中的元素非常简单:

len([],0).
len([H|T],N1) :- 
    len(T,N), 
    N1 is N+1.

内容如下:一个空列表 []0 个元素。如果 T 的长度为 N 并且 T 的长度可以拆分为头元素 H 和其余列表 T 的列表的长度为 N1 =20=]由N+1.

计算

那么缺少什么?您需要遍历所有子列表并获取子列表的长度。如果两个子列表的长度不同,则失败。如果您以始终相同的数字到达终点,则成功。所以模式看起来像这样:

isHotel(R):-
    isHotel(R,_). 

为计数添加一个占位符,此时第二个参数的实际数量无关紧要。

isHotel([],_) .

如果你到了没有剩余楼层的地步,接受任何数字。

isHotel([CurrentFloor|T],N) :- 
    len(CurrentFloor,N),
    isHotel(T,N).

如果还有楼层(楼层表可以分为当前楼层CurrentFloor和以上所有楼层T),统计本层的房间数,再去查看剩余楼层T。这是第一次运行时,将计算 N 房间的数量并将其转发给所有其他调用 - 因此第一次计算只是一次计算,在其他所有执行中它也是一次检查。如果两个欲望的大小不匹配,这会导致拒绝。请注意,此代码不会检查输入是否为数字列表列表。

使用 SWISH 检查:

?- isHotel([[101,102,103],[201,202,203],[301,302,303]]).
true.

?- isHotel([[101,102,103],[201,202,203],[301,302,3,03]]).
false.

?- isHotel([]).
true.