【发布时间】:2019-05-16 13:24:48
【问题描述】:
所以我有一个如下所示的列表:
[
["p1", "p2", "100", "Storgatan"],
["p1", "p3", "200", "Lillgatan"],
["p2", "p4", "100", "Nygatan"],
["p3", "p4", "50", "Kungsgatan"],
["p4", "p5", "150", "Kungsgatan"]
]
每个嵌套列表中的元素代表(按顺序):
第一个元素 = 起点
第二个元素 = 终点
第三个元素 = 距离
第 4 个元素 = 街道名称。
我现在必须写一个谓词来计算哪条街道最短,哪条街道最长,以及它们各自的(总和)距离。
例如,最终输出应如下所示:
Longest street: Kungsgatan, 200
Shortest street: Storgatan, 100
我真的不明白为什么起点和终点是这里的相关信息。我目前的想法是收集所有独特的街道名称,将它们与从零开始的每条街道的计数器一起放在一个单独的列表中,然后使用该列表来累积每条单独街道的所有距离。
类似:
create_sum_list([
["p1", "p2", "100", "Storgatan"],
["p1", "p3", "200", "Lillgatan"],
["p2", "p4", "100", "Nygatan"],
["p3", "p4", "50", "Kungsgatan"],
["p4", "p5", "150", "Kungsgatan"]
], SL).
SL= [[Storgatan, 0], [Lillgatan, 0],
[Nygatan, 0], [Kungsgatan ,0]]
accumulate(SL, List).
List=[[Storgatan, 100], [Lillgatan, 200],
[Nygatan, 100], [Kungsgatan ,200]]
这可能是一个愚蠢的想法,可能有更好的方法来解决这个问题。我想了很多不同的想法,要么我走到了死胡同,要么对于这样一个“简单”的任务来说太复杂了。
我可以通过“普通”命令式编程轻松实现这一点,但我是逻辑编程和 Prolog 的新手。我不知道如何实现这一点。
帮助?
谢谢!
【问题讨论】:
-
@GuyCoder 有很大的不同吗?我真的不知道。我猜我可以把它们转换成原子?
-
@GuyCoder 这不是错字。 Kungsgatan 的长度是 200。你看到 Kungsgatan 在我的列表中出现了两次,分别为 50 和 150 (150+50=200)?我正在总结街道的总长度。
-
这是家庭作业,但我编造了数据/列表的结构。在此之前的任务(我已经完成)是读取文件并将内容拆分为“适当的数据结构”。该文件将每个嵌套列表作为单独的行。例如首先是
p1\tp2\t100\tStorgatan,然后是下一行的p1\tp3\t200\tLillgatan。我在这里创建了一个相关的帖子:stackoverflow.com/questions/56159054/… -
@GuyCoder 这是文件内容:pastebin.com/V70Ubs4M 这是我用来读取文件并输出上述列表结构的代码:pastebin.com/3n1Htjgs
-
@GuyCoder 不,没有后续任务。这是我作业中的最后一项任务。
标签: list prolog sum counter accumulate