我正在尝试使用 DCG 将字符串拆分为由空格分隔的两部分。例如,'abc def' 应该还给我“abc”和“def”。程序和DCG如下。
main:-
prompt(_, ''),
repeat,
read_line_to_codes(current_input, Codes),
(
Codes = end_of_file
->
true
;
processData(Codes),
fail
).
processData(Codes):-
(
phrase(data(Part1, Part2), Codes)
->
format('~s, ~s\n', [ Part1, Part2 ])
;
format('Didn''t recognize data.\n')
).
data([ P1 | Part1 ], [ P2 | Part2 ]) --> [ P1 | Part1 ], spaces(_), [ P2 | Part2 ].
spaces([ S | S1 ]) --> [ S ], { code_type(S, space) }, (spaces(S1); "").
这可以正常工作。但我发现必须输入[ P1 | Part1 ]
&[ P2 | Part2 ]
真的很冗长。因此,我尝试在 的定义中替换所有[ P1 | Part1 ]
w/ Part1
& 同样 w/的实例,即以下内容。[ P2 | Part2 ]
data
data(Part1, Part2) --> Part1, spaces(_), Part2.
这更容易输入,但这给了我一个Arguments are not sufficiently instantiated
错误。所以看起来未绑定的变量不会自动解释为 DCG 中的代码列表。有没有其他方法可以减少冗长?我的意图是在其他编程语言中使用正则表达式的地方使用 DCG。