Я пытаюсь напечатать часть изображения в Прологе, но сталкиваюсь с ошибкой, которую не понимаю. Вот код:
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. Что именно здесь происходит? Как я могу избежать этой проблемы в будущем?