在 Prolog 中处理用户对 "phrase/3" 方法的输入

Process user input to "phrase/3" method in Prolog

我已经用 Prolog 构建了一个 DCG。当我执行以下调用时,代码有效:

phrase(programm(R), [1,+,2], []).

我想让用户写输入,所以我这样做了:

main :- read(Input), atom_chars(Input, R), write(R), phrase(programm(E), R).

调用 main 和 input 例如“1+2”不起作用。如何处理用户输入的短语方法来调用我的 DCG?

SWI-Prolog 通过 tokenize_atom 提供了一种方便的方法。

program(sum(L,R)) --> [L, +, R].

?- tokenize_atom('1 + 2', L), phrase(program(P), L).
L = [1, +, 2],
P = sum(1, 2).

根本问题在于您在语法中定义字符和数字的方式。我假设你定义了一些东西:

program(sum(L,R)) -->
    [L],
    [+],
    [R].

你首先需要

:- set_prolog_flag(double_quotes, chars).

program(sum(L,R)) -->
   number(L),
   "+",
   number(R).

number(1) --> "1".

注意 1 是整数,"1"['1']!