Парсинг чисел с несколькими цифрами в Прологе

У меня есть следующий синтаксический анализатор простого выражения:

expr(+(T,E))-->term(T),"+",expr(E).
expr(T)-->term(T).

term(*(F,T))-->factor(F),"*",term(T).
term(F)-->factor(F).

factor(N)-->nat(N).
factor(E)-->"(",expr(E),")".

nat(0)-->"0".
nat(1)-->"1".
nat(2)-->"2".
nat(3)-->"3".
nat(4)-->"4".
nat(5)-->"5".
nat(6)-->"6".
nat(7)-->"7".
nat(8)-->"8".
nat(9)-->"9".

Однако это только поддерживает 1-разрядные числа. Как я могу проанализировать числа с несколькими цифрами в этом случае?

10
задан false 26 November 2011 в 02:01
поделиться

3 ответа

Используйте аккумуляторные переменные и передайте их в рекурсивных вызовах. Далее A и A1 - это аккумулятор.

digit(0) --> "0".
digit(1) --> "1".
% ...
digit(9) --> "9".

nat(N)   --> digit(D), nat(D,N).
nat(N,N) --> [].
nat(A,N) --> digit(D), { A1 is A*10 + D }, nat(A1,N).

Обратите внимание, что первое предложение nat инициализирует аккумулятор, потребляя цифру, потому что вы не хотите сопоставлять пустую строку.

9
ответ дан 4 December 2019 в 03:37
поделиться

Вы можете предоставить образец ввода?

Я думаю, что может ] работа:

nat(N)-->number(N).

Если это не удается, попробуйте:

nat(N)-->number(N),!.

The! это разрез, он останавливает объединение. Вы можете прочитать об этом в книгах / учебных пособиях.

-3
ответ дан 4 December 2019 в 03:37
поделиться
nat(0). 
nat(N):-nat(N-1).

Но вы используете синтаксис, который я не знаю (см. мой комментарий выше).

-1
ответ дан 4 December 2019 в 03:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: