我正在使用this代码。我正在与prolog逻辑范式斗争。我有这两个问题。
答案 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.
。