忽略其余的输入

时间:2016-06-26 15:28:00

标签: prolog swi-prolog dcg

忽略其余输入的首选方法是什么?我发现了一种有点冗长的方式:

ignore_rest --> [].
ignore_rest --> [_|_].

它有效:

?- phrase(ignore_rest, "foo schmoo").
true ;

但是当我试图将这两条规则分解为:

ignore_rest2 --> _.

然后它没有:

?- phrase(ignore_rest2, "foo schmoo").
ERROR: phrase/3: Arguments are not sufficiently instantiated

2 个答案:

答案 0 :(得分:4)

你想要的是声明有一系列任意多个字符。描述这个的最简单方法是:

... -->
   [].
... -->
   [_],
   ... .

使用[_|_]作为非终端,是一个SWI-Prolog特定的扩展,这是一个很大的问题。事实上,在过去,[_|_]有几个不同的扩展/解释。最值得注意的是,当'.'/4被用作非终端时,Quintus Prolog允许定义要调用的用户定义的[_|_]。请注意,[_|[]]仍被视为终端!实际上,这是一个实现错误。但是,它被利用了。请参阅以下示例:

  

David B. Searls,用明确的条款语法研究DNA的语言学。 NACLP 1989。

答案 1 :(得分:4)

为什么不简单地使用phrase/3代替phrase/2?例如,假设您有一个prefix//0非终端仅消耗部分输入:

?- phrase(prefix, Input, _).

phrase/3的第三个参数返回非消费终端,您可以忽略它们。