Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言混乱。有人能解释一下minimal是如何工作的吗?_Prolog_Shortest Path - Fatal编程技术网

Prolog 序言混乱。有人能解释一下minimal是如何工作的吗?

Prolog 序言混乱。有人能解释一下minimal是如何工作的吗?,prolog,shortest-path,Prolog,Shortest Path,我对代码的理解达到了最低限度,但在那之后,变量太多了,我一直不知道每个变量在做什么。如果有人能解释它或者用重命名的变量来解释它,那将是一个惊人的帮助,因为我认为这段代码可能会在我的圣诞考试中出现,我希望能够解释发生了什么 road(a, b, 1). road(b, c, 1). road(a, c, 13). road(d, a, 1). /*Getting from A to B through a list of places R in N kms*/ route(A,B,R,N) :-

我对代码的理解达到了最低限度,但在那之后,变量太多了,我一直不知道每个变量在做什么。如果有人能解释它或者用重命名的变量来解释它,那将是一个惊人的帮助,因为我认为这段代码可能会在我的圣诞考试中出现,我希望能够解释发生了什么

road(a, b, 1).
road(b, c, 1).
road(a, c, 13).
road(d, a, 1).

/*Getting from A to B through a list of places R in N kms*/
route(A,B,R,N) :- travel(A,B,[A],Q,N), reverse(Q,R).

/*Travelling from A to B through P a list of towns B|P of distance L*/
travel(A,B,P,[B|P],Dist) :- road(A,B,Dist).

/*Travelling from A to B through Visited, on your Route R with distance Distance*/
/*Find if there is a road from A to b and store the distance. Make sure C is not equal to B*/
travel(A,B,Visited,R,Distance) :-
    road(A,C,Dist), C \== B,

    /*Make sure C is not in Visited to avoid infinite loop,
      use recursion to find the full route and distance */
    \+member(C,Visited), travel(C,B,[C|Visited],R,Dist1), Distance is Dist + Dist1.

/*Find the shortest route from A to B*/
shortest(A,B,R,N) :-
    setof([Route,Dist],route(A,B,Route,Dist),Set),
    Set = [_|_], minimal(Set,[R,N]).

minimal([F|R],M) :- min(R,F,M).

/*The shortest path*/
min([],M,M).
min([[P,L]|R],[_,M],Min):- L < M, !, min(R,[P,L],Min).
min([_|R],M,Min) :- min(R,M,Min).
道路(a、b、1)。
道路(乙,丙,一)。
道路(甲,丙,十三)。
道路(丁,甲,一)。
/*从A到B通过N公里内的位置列表R*/
路线(A,B,R,N):-行程(A,B,[A],Q,N),反向(Q,R)。
/*从A到B经过P A距离L的城镇B | P列表*/
旅行(A,B,P,[B | P],区):道路(A,B,区)。
/*从A到B,经过参观,在R路线上行驶,距离*/
/*查找a到b之间是否有道路,并存储距离。确保C不等于B*/
行程(A、B、到访、R、距离):-
道路(A,C,区),C\==B,
/*确保C未处于访问状态以避免无限循环,
使用递归查找完整路线和距离*/
\+成员(C,已访问),旅行(C,B,[C |已访问],R,距离1),距离为距离+距离1。
/*找到从A到B的最短路线*/
最短(A、B、R、N):-
集合([路线,距离],路线(A,B,路线,距离),集合),
Set=[124; 124;],极小值(Set[R,N])。
最小值([F | R],M):-min(R,F,M)。
/*最短路径*/
最小值([],M,M)。
最小值([P,L]| R],[um],min):-L
由于setof提供了一个已排序的解决方案列表,因此只要生成适当“形状”的解决方案就足够了,将要最小化的值放在第一位:try

shortest(A,B,R,N) :-
  setof((Dist,Route), route(A,B,Route,Dist), [(N,R)|_]).

你能提供调用shortest的例子吗?很抱歉,我会发布完整的代码,但它相当长。不是我要求的,但可以。