合法使用(\ +)// 1

时间:2012-10-06 09:35:54

标签: prolog dcg iso-prolog

在语法规则()中,有几个预定义的构造:(',')//2意味着连接,('|')//2意味着交替等。一个由几个但不是所有Prolog系统支持的构造是(\+)//1

就个人而言,我只是为了使用它而使用它。我从未在其他人编写的代码中看到它。

那么,是否合法使用(\+)//1

编辑:此外,(\+)//1在查询phrase(nt, L)中是否合法使用L未实例化的变量。

2 个答案:

答案 0 :(得分:4)

\ +可用于创建不那么模糊的语法。 使用\ +的优势!例如,是肯定的 \ _的声明性,以便例如生成的DCG 规则可以重新排序。

让我们举一个例子,考虑以下语法:

s([X|Y]) --> t(X), s(Y).               % 1
s([])    --> [].                       % 2

t(2)     --> [a,a].                    % 3
t(1)     --> [a].                      % 4

上面的语法非常模糊,例如我得到了多个 解析以下输入:

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..

现在假设我想要更长时间的解析 简短的解析我可以通过以下方式做到这一点:

t(2)     --> [a,a], !.                 % 5
t(1)     --> [a].                      % 6

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

不幸的是我无法重新排序。自从做以下事情 没有给出理想的结果。虽然s(A)现在产生了 结果以不同的顺序,我们回到原点, 因为语法再次含糊不清:

t(1)     --> [a].                      % 7
t(2)     --> [a,a], !.                 % 8

?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...

现在让我们尝试使用\ +。我们可以更换切割 通过以下否定:

t(2)     --> [a,a].                    % 9
t(1)     --> [a], \+ [a].              % 10

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

现在让我们试试是否可以重新排序。我们重新排序 t // 1的语法规则:

t(1)     --> [a], \+ [a].              % 11
t(2)     --> [a,a].                    % 12

?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No

声明性非常有用。这意味着例如 我们可以在从右到左的图表解析器中使用\ + 以任意顺序选择语法规则。该 声明性确保自下而上向前链接 图表解析器的结果与...无关 DCG规则的输入顺序。

然后可以大量应用DCG技术 自然语言(NL)项目,它可以很好地扩展。该 NL语法可以根据经验调整为确定性。 语法越确定,效率越高 它的解析。复杂的NL语法,否则 难以理解的。

再见

答案 1 :(得分:1)

当L未实例化时,语法用于文本生成。然后 你根本不需要语法\ +。因为不存在歧义问题 从一些文字。

让我们举一个例子,考虑以下语法:

s([X|Y]) --> t(X), s(Y).               % 1
s([])    --> [].                       % 2

t(2)     --> [a,a].                    % 3
t(1)     --> [a].                      % 4

每个不同的解析都有一个不同的解析树。而且没有歧义 使用短语/ 2生成文本。以下查询只提供一个 回答:

?- phrase(s([2,1]),L).
L = [a,a,a]
?- phrase(s([1,2]),L).
L = [a,a,a]
?- phrase(s([1,1,1]),L).
L = [a,a,a]

但是有一点重用问题。假设我有一个带有\ + for的NL语法 解析。然后我不能用它来解析。自实例化模式 \ +目标将是不同的,因此构造的语义 变化。

出路可能只是使用两个语法。一个用于解析,一个用于解析 unparsing。我猜解析和解析是两种不同的认知能力。 记得在学校,有阅读练习和写作练习。该 在计算机科学中也是如此。

我认为在某些情况下也可以使用单个语法,并将\ +视为 消除歧义的注释,在不完整或不同的情况下删除 处理。人们可以建立这样一种机制。但与解析相关的问题 解析更深入:辅助条件的双向性({} / 1),左递归 在解体等期间......

再见