列表中的 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.
我是 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.