Пролог: Как проверить, инициализируется ли переменная перед использованием? - PullRequest
0 голосов
/ 05 мая 2011

У меня есть код, который выглядит так:

path(Node1, Node2, Distance):- edge(Node1, Node2, Dist),
    Distance is Dist + Distance, !.

Это правило будет вызываться рекурсивно; однако всякий раз, когда я пытаюсь вызвать это, возникает ошибка, указывающая, что Расстояние недостаточно инициализировано. Почему это происходит? Я предполагаю, что решение было бы проверить, инициализируется ли расстояние в первую очередь. Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 05 мая 2011

Кажется, что ваш код в любом случае не будет делать то, что вы хотите. Предполагается ли рассчитать расстояние между узлами в графе? Чем вы начинаете с этого куска кода (не проверено):

path(Node1, Node2, Dist):-edge(Node1, Node2, Dist), !.   (0)
path(Node1, Node2, Dist):-
      edge(Node1, NodeBetween, DistToBetween), 
      path(NodeBetween, Node2, DistFromBetween), (1)
      Dist is DistToBetween + DistFromBetween.   (2)

Теперь, когда вы спросите двигатель Prolog, например, path(a,b,Distance), он даст вам расстояние между a и b в переменной Distance.

Немного неофициальное описание того, что здесь происходит: Переменная будет «инициализирована» в edge(Node1, Node2, Dist), !. (0) и будет инициализирована на расстояние между Node1 и Node2, после чего к ней будут добавлены другие числа, в то время как Prolog будет оценивать (1) и чем (2) ,

Однако логическое программирование отличается от «обычного» процедурного программирования, нужно думать немного иначе. Удачи с этим. Btw. В прологе SWI есть хороший отладчик, который может помочь понять, что происходит под капотом при оценке предиката.

0 голосов
/ 05 мая 2011

Я считаю, что вы не можете использовать Расстояние в Distance is Dist + Distance, !., пока оно не инициализировано.

Вы пытаетесь добавить расстояние до расстояния до его инициализации.

Вероятно, вы пытаетесь сделать

path(Node1, Node2, Distance):- edge(Node1, Node2, Dist), Distance is Dist.

Редактировать

Попробуйте сделать то же самое, не смешивая входные и выходные переменные:

path(Node1, Node2, Distance):- path(Node1, Node2, Distance).
path(Node1, Node2, InitialDistance, Distance):- edge(Node1, Node2, Dist), 
                                                Distance is InitialDistance + Dist, !.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...