Боюсь, вам на самом деле не удалось использовать определенную вами DCG. float/1
- это встроенная функция, которую вы вызываете, и, не цитируя ничего, вы фактически не передали строку во что-либо для анализа. Пролог анализирует ваш вклад как литерал;если это не удастся из-за синтаксической проблемы, больше ничего не произойдет. Кроме того, чтобы задействовать систему DCG, вы должны использовать phrase/2
, а это не так, поэтому даже когда вы передаете вещи в isFloat/2
, они просто передают их напрямую float/1
.
Кроме того, имейте в виду, что DCG магически не возвращают то, что они проанализировали. Если ваше правило DCG не имеет ничего перед стрелкой, из phrase/2
вам ничего не вернется. Таким образом, код, который у вас есть, это принятие операций с плавающей запятой (или с изменениями ниже), но на самом деле парсинг операций с плавающей запятой из строки в фактическое представление с плавающей запятой не выполняется.
Фактический вызов вашего кода будет выглядеть примерно так:
phrase(float, `+12.234`).
Это не удастся по нескольким причинам, наиболее очевидным из которых является то, что ваше правило digit//0
не выполняет то, что вы думаете, оно делает. На самом деле он ожидает точно список цифр от 0 до 9. Вероятно, вы захотите сделать что-то похожее на это:
digit --> "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
Как только вы это сделаете, вы сможетеразобрать "номер". Но вы делаете аналогичную ошибку в sign//0
, потому что запятая в Прологе означает и , а не или . Фиксированный код выглядит следующим образом:
sign --> "" | "+" | "-".
float --> sign, number, ".", number.
number --> digit.
number --> digit, number.
digit --> "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
И его использование выглядит следующим образом:
?- phrase(float, `-923.23`).
true
Обратите внимание, что теперь вы получаете ожидаемые ошибки разбора:
?- phrase(float, `-923..23`).
false.
Обратите внимание, что это не вернет вам поплавок. Вам придется проделать больше работы, чтобы достичь этого.