gpt4 book ai didi

prolog - DCG 惯用短语偏好

转载 作者:行者123 更新时间:2023-12-02 07:25:43 29 4
gpt4 key购买 nike

我有一个手动制定的 DCG 规则来选择惯用短语超过单个单词。 DCG规则如下:

seq(cons(X,Y), I, O) :- noun(X, I, H), seq(Y, H, O), \+ noun(_, I, O).
seq(X) --> noun(X).

第一个子句是手动创建的,因为使用了 (:-)/2(-->)/2。我可以将这个手动创建的子句替换为一些使用标准 DC​​G 的子句?

最诚挚的问候

P.S.:这是一些测试数据:

noun(n1) --> ['trojan'].
noun(n2) --> ['horse'].
noun(n3) --> ['trojan', 'horse'].
noun(n4) --> ['war'].

这里是一些测试用例,重要的测试用例是第一个测试用例,因为它只传递 n3 而不是 cons(n1,n2)。第一个测试用例的行为是特别需要的:

?- phrase(seq(X),['trojan','horse']).
X = n3 ;
No
?- phrase(seq(X),['war','horse']).
X = cons(n4,n2) ;
No
?- phrase(seq(X),['trojan','war']).
X = cons(n1,n4) ;
No

最佳答案

(为了避免与其他非终端发生冲突,我将您的 seq//1 重命名为 nounseq//1)

Can I replace this manually made clause by some clause that uses standard DCG?

不,因为它不是坚定的,它是 STO(详情如下)。

预期含义

但是让我从你的程序的预期含义开始。您说您想要选择惯用短语而不是单个单词。你的程序真的这样做吗?或者,换句话来说,你的定义真的很独特吗?我现在可以构造一个反例,但让 Prolog 来思考:

nouns --> [] | noun(_), nouns.?- length(Ph, N), phrase(nouns,Ph),      dif(X,Y), phrase(nounseq(X),Ph), phrase(nounseq(Y),Ph).   Ph = [trojan,horse,trojan], N = 3, X = cons(n1,cons(n2,n1)), Y = cons(n3,n1);  ...;  Ph = [trojan,horse,war], N = 3, X = cons(n3,n4), Y = cons(n1,cons(n2,n4));  ... .

所以你的定义不明确。您本质上想要的(可能)是某种重写系统。但这些很少以明确的方式定义。如果两个单词像附加的名词(n5) --> [horse, war]. 等重叠,会怎样?

<小时/>

一致性

预先声明:目前,DCG 文档仍在开发中 - 非常欢迎提出意见!您找到所有 Material in this place 。所以严格来说,目前 DCG 还没有一致性的概念。

坚定

一致的定义必须保持的一个核心属性是坚定性。因此,在研究您的定义之前,我将比较 phrase/3 的两个目标(在默认模式下运行 SWI)。

?- Ph = [], phrase(nounseq(cons(n4,n4)),Ph0,Ph).   Ph = [], Ph0 = [war,war];  false.?- phrase(nounseq(cons(n4,n4)),Ph0,Ph), Ph = [].   false.?- phrase(nounseq(cons(n4,n4)),Ph0,Ph).   false.

将目标Ph = []移动到最后,删除唯一的解决方案。因此,你的定义并不坚定。这是由于您处理 (\+)/1 的方式造成的:变量 O 不得出现在 (\+)/1 中>。但另一方面,如果它没有出现在 (\+)/1 内,您只能检查句子的开头。而不是整个句子。

服从事件检查属性

但情况更糟:

?- set_prolog_flag(occurs_check,error).   true.?- phrase(nounseq(cons(n4,n4)),Ph0,Ph).ERROR: noun/3: Cannot unify _G968 with [war|_G968]: would create an infinite tree

因此,您的程序依赖于 STO 统一(subject-to-occurrs-check 统一),其结果在中明确未定义

ISO/IEC 13211-1 Subclause 7.3.3 Subject to occurs-check (STO) and not subject to occurs-check (NSTO)

这实际上是由于您打算定义两个非终结符的交集。考虑以下表达方式:

:- op(  950,  xfx, //\\).  % ASCII approximation for ∩ - 2229;INTERSECTION(NT1 //\\ NT2) -->   call(Xs0^Xs^(phrase(NT1,Xs0,Xs),phrase(NT2,Xs0,Xs))).

% 以下是在 library(lambda) 中预定义的:

^(V0, Goal, V0, V) :-   call(Goal,V).^(V, Goal, V) :-   call(Goal).

有了这个定义,我们就可以进入 STO 的情况了:

?- phrase(([a]//\\[a,b]), Ph0,Ph).ERROR: =/2: Cannot unify _G3449 with [b|_G3449]: would create an infinite tree

事实上,当使用有理树时,我们得到:

?- set_prolog_flag(occurs_check,false).   true.?- phrase(([a]//\\[a,b]), Ph0,Ph).   Ph0 = [a|_S1], % where      _S1 = [b|_S1],   Ph = [b|_S1].

因此,存在一个无限列表,对于自然语言句子来说当然没有多大意义(除了拥有无限资源和能力的人......)。

关于prolog - DCG 惯用短语偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782324/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com