忽略其余输入

Ignore rest of input

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

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

你想要的是声明存在任意多个字符的序列。最简单的描述方式是:

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

像您一样使用 [_|_] 作为非终端,是一个 SWI-Prolog 特定的扩展,这是一个很大的问题。事实上,在过去,[_|_] 有几个 不同的 扩展名 to/interpretations。最值得注意的是,Quintus Prolog 确实允许定义一个用户定义的 '.'/4,以便在 [_|_] 用作非终端时调用。请注意 [_|[]] 仍被视为终端!实际上,这是一个执行错误。但是,尽管如此,它还是被利用了。请参阅这样的示例:

David B. Searls, Investigating the Linguistics of DNA with Definite Clause Grammars. NACLP 1989.

为什么不简单地使用 phrase/3 而不是 phrase/2?例如,假设您有一个 prefix//0 非终结符,它只消耗部分输入:

?- phrase(prefix, Input, _).

phrase/3的第三个参数returns未使用的终端,您可以忽略它。