Почему я получаю ошибку существования в Прологе, и что это значит? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь напечатать часть изображения в Прологе, но сталкиваюсь с ошибкой, которую не понимаю. Вот код:

a(LeftRightMargin, TopBotMargin, TextSpace, TextFont) :-
   TextWidth is TextFont * 3, TextHeight is TextFont * 5,
   LineLen is TextWidth * 3 + TextSpace * 2 + LeftRightMargin * 2,
   draw(LeftRightMargin, TopBotMargin, TextSpace, TextWidth, TextHeight, TextFont, 0). 

draw(LeftRightMargin, TopBotMargin, TextSpace, TextWidth, TextHeight, TextFont, TextHeight).
draw(LeftRightMargin, TopBotMargin, TextSpace, TextWidth, TextHeight, TextFont, Line) :-
   Line < TextHeight, 
   write('|'),
   drawSymbol(' ', LeftRightMargin),
   drawA(TextWidth, TextHeight, TextFont, Line, 0),
   drawSymbol(' ', LeftRightMargin),
   write('|'),
   write('\n'),
   NextLine is Line + 1,
   draw(LeftRightMargin, TopBotMargin, TextSpace, TextWidth, TextHeight, TextFont, NextLine).

drawA(TextWidth, TextHeight, TextFont, Line, TextWidth).
drawA(TextWidth, TextHeight, TextFont, Line, Col) :-
   ((Line >= 0, Line < 2 * TextFont); (Line >= 3 * TextFont, Line < 4 * TextFont); (Line >= 4 * TextFont, Line < 5 * TextFont)),
   ((Col >= 0, Col < TextFont); (Col >= 2 * TextFont, Col < 3 * TextFont)),
   drawSymbol('*', TextFont),
   NextCol is Col + TextFont,
   drawA(TextWidth, TextHeight, TextFont, Line, NextCol).
drawA(TextWidth, TextHeight, TextFont, Line, Col) :-
   ((Line >= TextFont, Line < 2 * TextFont); (Line >= 3 * TextFont, Line < 4 * TextFont); (Line >= 4 * TextFont, Line < 5 * TextFont)),
   Col >= 1 * TextFont, Col < 2 * TextFont,
   drawSymbol(' ', TextFont), NextCol is Col + TextFont,
   drawA(TextWidth, TextHeight, TextFont, Line, NextCol).
drawA(TextWidth, TextHeight, TextFont, Line, Col) :-
   ((Line >= 0, Line < TextFont); (Line >= 2 * TextFont, Line < 3 * TextFont)),
   Col < 3 * TextFont,
   drawSymbol('*', TextFont),
   NextCol is Col + TextFont,
   drawA(TextWidth, TextHeight, TextFont, Line, NextCol).

Вот трассированный код и ошибка, которую он мне дает.

{trace}
| ?- a(3,2,2,2).
      1    1  Call: a(3,2,2,2) ? 
      2    2  Call: _110 is 2*3 ? 
      2    2  Exit: 6 is 2*3 ? 
      3    2  Call: _138 is 2*5 ? 
      3    2  Exit: 10 is 2*5 ? 
      4    2  Call: _125 is 6*3+2*2+3*2 ? 
      4    2  Exit: 28 is 6*3+2*2+3*2 ? 
      5    2  Call: draw(3,2,2,6,10,2,0) ? 
      6    3  Call: 0<10 ? 
      6    3  Exit: 0<10 ? 
      7    3  Call: write('|') ? 
|
      7    3  Exit: write('|') ? 
      8    3  Call: drawSymbol(' ',3) ? 
      8    3  Exception: drawSymbol(' ',3) ? 
      5    2  Exception: draw(3,2,2,6,10,2,0) ? 
      1    1  Exception: a(3,2,2,2) ? 
uncaught exception: error(existence_error(procedure,drawSymbol/2),draw/7)

Почему существует проблема с процедурой drawSymbol? В других ответах упоминается, что это проблема используемой версии GNU Prolog. Я получил эту же ошибку, используя 1.4.5 и 1.4.4. Что именно здесь происходит? Как я могу избежать этой проблемы в будущем?

...