Если нет пути с длиной 0
, это не сработает, и даже тогда, скорее всего, оно не даст того, что вы хотите: оно просто скажет true.
В Prolog переменные могут быть толькоустановить один раз, это означает, что если L
установлено на 0
, то оно остается 0
, если вы не вернетесь к этому назначению.
Здесь это, таким образом, означает, что вы вызываете highest(0)
, затем выпоручите Прологу вызвать path(_, _, Z)
, и это может привести к нулю, одному или нескольким решениям.Если нет path(_, _, Z)
s, то вызов не удастся.Но в случае наличия, Z
будет (если я сделаю правильные предположения о предикате) иметь числовое значение, например 7
.
Теперь условие Z >= L
, конечно, выполняется в этомcase (если Z
равно 7
), то это не проблема.Но теперь вы указываете L is Z
.Это значит, что вы звоните 0 is 7
.Предикат is/2
[swi-doc] предназначен для решения выражения второго аргумента (в данном примере это выражение 7
, так что решать не так уж и много), а затем стремится объединить его с термином с левой стороны.Но так как 0
не равен 7
, что не получается.
Если вы хотите получить самый высокий путь, вы можете, например, использовать aggregate
[swi-doc] библиотека:
:- use_module(library(aggregate)).
highest(L) :-
aggregate(Max(Z), path(_,_,Z), Max(L)).
Затем вы можете вызвать его с помощью higest(X)
, чтобы объединить X
с наибольшим значением для Z
при вызове path(_, _, Z)
.