Простой предикат Пролога - оператор всегда оценивается как ложный - PullRequest
0 голосов
/ 22 февраля 2019

Я только что запустил Prolog и по-настоящему удивляюсь, почему следующие строки, в частности часть 'is', всегда выдают false:

highest(L) :-
    path(_,_,Z),
    Z >= L,
    L is Z.
highestWrap :-
    highest(0).

вызывается самая высокая обертка.

Заранее спасибои хорошего дня!

1 Ответ

0 голосов
/ 22 февраля 2019

Если нет пути с длиной 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...