Prolog 如何在图中找到深度有限的路径?

Prolog 如何在图中找到深度有限的路径?,prolog,Prolog,这里您非常接近于一个工作谓词。我已经包含了一段代码片段,希望能解决您犯的一些小错误。请注意,find/3是实际从外部使用的谓词,即所谓的包装子句 find/4的工作方式如下: 第一条仅用于检测最大深度的海侵。 第二个子句仅用于检测目标节点,即与给定标记匹配的节点。 第三个子句的真正任务是在图中查找对称链接。 需要注意的一些小事情: 将symlink/2重命名为symmetric_link/2,以避免与符号链接混淆。 用\+代替not表示否定,我认为前者更常见。 将tag/2用于标记节点,而不是p

这里您非常接近于一个工作谓词。我已经包含了一段代码片段,希望能解决您犯的一些小错误。请注意,find/3是实际从外部使用的谓词,即所谓的包装子句

find/4的工作方式如下:

第一条仅用于检测最大深度的海侵。 第二个子句仅用于检测目标节点,即与给定标记匹配的节点。 第三个子句的真正任务是在图中查找对称链接。 需要注意的一些小事情:

将symlink/2重命名为symmetric_link/2,以避免与符号链接混淆。 用\+代替not表示否定,我认为前者更常见。 将tag/2用于标记节点,而不是profile/2,以避免与评测/分析代码性能的行为混淆。 代码段:

link(a, b).
link(a, c).
link(b, c).
link(b, e).
link(c, f).
link(c, g).
link(c, d).

symlink(F1, F2) :-
  link(F1, F2).

symlink(F1, F2) :-
  link(F2, F1).

profile(a,box). %Tag it is the same as box for a.

find(Start, Tag, Rpath) :
  find2(Start, Tag, 0, [], Rpath).

find2(Step, Tag, Count, Path, Rpath) :-
  C is Count +1,
  C < 5,
  symlink(Step, A),
  compat(A,Tag), % Compatible means the distance between the tag of A
                 % and the Tag that is given as argument should be maximum 1. 
  append(Path, [A|E],Rpath), %This part i want make my final path in Rpath.
  not(member(Step,Path)),
  find2(A, Tag, C, [Step|Path], Rpath).
用法示例:

link(a, b).
link(a, c).
link(b, c).
link(b, d).
link(b, e).
link(c, f).
link(c, g).
link(c, d).

tag(a, box).

symmetric_link(F1, F2) :-
  link(F1, F2).
symmetric_link(F1, F2) :-
  link(F2, F1).

maximum_depth(5).

find(Start, End, Path):-
  find(Start, End, 0, [Start], Path).

find(_, _, Depth, _, _):-
  maximum_depth(Max),
  Depth > Max, !,
  fail.
find(Node, Tag, _, _, [Node]):-
  tag(Node, Tag), !.
find(Node1, Tag, Depth1, History, [Node1|Path]):-
  symmetric_link(Node1, Node2),
  \+ memberchk(Node2, History),
  Depth2 is Depth1 + 1,
  find(Node2, Tag, Depth2, [Node2|History], Path).
我还没有完全测试这个谓词,我建议您为这类谓词编写一个单元测试。我使用它,它在SWI Prolog和SICStus Prolog上运行,但也可能有其他的


希望这有帮助

是的,这很好,我想知道的是:如果我们有不同的验证作为我的例子,我应该为每个条件写子句,还是我可以在一个或最多两个子句中完成?你的化学需氧量帮了我很多。有什么不同?你能举个例子吗?比如:memberchkNode2,History,Depth>Max,compatA,Tag>>>Compatible意味着A的标记和作为参数给出的标记之间的距离应该最大为1。@user258403我的代码在第1条中进行深度检查。历史检查在第3条中完成。您询问的兼容性检查没有出现在我的代码中,但我将其称为目标条件,即检查给定节点是否为目标节点。当前目标条件为tagNode,Tag。这是您必须介绍自己的目标条件/兼容性检查的地方。
?- find(g, box, Path).
Path = [g, c, d, b, a] ;
Path = [g, c, a] ;
Path = [g, c, b, a].