Prolog从另一个角度断言

时间:2018-04-19 17:32:47

标签: prolog

我正在使用this代码。我正在与prolog逻辑范式斗争。我有这两个问题。

  1. 有没有办法可以将路径谓词更改为最好的"最佳"路径,但要按顺序获取导致该节点/位置的所有路径?
  2. 如何使路径谓词更加“用户友好”#34;然后插入我想要计算的两个位置,例如路径(伦敦,曼彻斯特)

1 个答案:

答案 0 :(得分:0)

  

有没有办法可以将路径谓词更改为最好的"最佳"路径,但要按顺序获得导致该节点/位置的所有路径?

给定代码非常专用于Dijkstra算法并且仅用于查找最短路径。我没有看到修改的简单方法来提供您的要求。 (最初我认为仅仅删除一些削减就足够了,但我还没有取得成功。欢迎评论!)

如果你想要两个节点之间的所有路径,你不需要Dijkstra算法的复杂性。这是一个最合理的答案,它定义了一个枚举所有路径的谓词:https://stackoverflow.com/a/27194523/4391743("大多数情况下"合理,因为格式不漂亮,并且因为min(i, j)谓词会更好使用通用$userName = "User Test" $nameParts = $userName.Split(' ') $userEmail = "test.user@email.com" if($userEmail -eq "$($nameparts[1]).$($nameParts[0])@email.com") { "'$userEmail' is a valid email for '$userName'" } else { "'$userEmail' is NOT a valid email for '$userName'" } 谓词表示,例如此处给出的谓词:https://stackoverflow.com/a/10322639/4391743

此处还有许多其他Prolog路径查找问题,但我还没有找到一个 最适合初学者的答案。

编辑:忘记添加上面给出的谓词计算所有路径,但不会产生它们"按顺序"。列举按长度排序的所有路径并不容易。这里最好的方法是枚举所有路径及其长度,使用unvisited/2计算所有这些路径的单个列表,并按长度对该列表进行排序。

  

如何使路径谓词更加“用户友好”#34;然后插入我想要计算的两个位置,例如路径(伦敦,曼彻斯特)

如果你的谓词有太多的参数,只需定义另一个隐藏其中一些的参数:

non_member/2

这只会成功或失败,但不会再告诉你任何事情:

findall/3

在Prolog中,使用不同的arities重载谓词名称是正常的,这就是为什么对谓词的引用通常包括arity。在上面的定义中,我们根据path(Start, End) :- path(Start, End, _Path, _Distance). 定义?- path(london, manchester). true.