Prolog 有人能解释一下如何用定冠词语法统一答案吗?
我试图理解定句语法中的统一概念,是否有人能够一步一步地解释一个人是如何从下面的DCG中得到答案的Prolog 有人能解释一下如何用定冠词语法统一答案吗?,prolog,dcg,successor-arithmetics,Prolog,Dcg,Successor Arithmetics,我试图理解定句语法中的统一概念,是否有人能够一步一步地解释一个人是如何从下面的DCG中得到答案的 s --> symbols(Sem,a), symbols(Sem,b). symbols(s(end),S) --> [S]. symbols(s(Sem),S) --> [S], symbols(Sem,S). 答案产生了aaabbb,但我在网上搜索了很久,试图找到你是如何得到这个答案的,如果有人能用几个步骤来解释这个问题,或者至少让我看看正在发生的事情,我将永远感激 wi
s --> symbols(Sem,a), symbols(Sem,b).
symbols(s(end),S) --> [S].
symbols(s(Sem),S) --> [S], symbols(Sem,S).
答案产生了aaabbb
,但我在网上搜索了很久,试图找到你是如何得到这个答案的,如果有人能用几个步骤来解释这个问题,或者至少让我看看正在发生的事情,我将永远感激
wikipedia页面上可以找到DCG的类似示例,只是它产生了aaabbccc
谢谢谓词
符号
从列表中获取N
次S
。但是N
不是作为“正常”数字编码的,它们的编码方式与peano算术中的数字类似:end
是0(通常用0代替end),而s(N)
表示N+1
条款
symbols(s(end),S) --> [S].
symbols(s(Sem),S) --> [S], symbols(Sem,S).
取一个元素S
。我们可以将s(end)
解释为表示数字1的术语
条款
symbols(s(end),S) --> [S].
symbols(s(Sem),S) --> [S], symbols(Sem,S).
获取一个元素S
,并递归调用具有相同元素的符号。同样,我们将s(Sem)
解释为一个数字:然后它意味着:取N+1
(s(Sem)
)元素s
,首先取一个s
,然后递归地取N
元素s
谓词s
只取一个as数,然后取相同数目的bs
第一个解决方案实际上是
ab
,因为符号(Sem,a)
与第一个规则匹配,并将Sem
与s(end)
统一起来。然后调用符号(s(end),b)
,唯一的匹配规则是第一个。首先询问所有可能的句子。例如,您可以使用最一般的查询:
?- phrase(s,L).
L = [a, b] ;
L = [a, a, b, b] ;
L = [a, a, a, b, b, b] ; % this is your example
L = [a, a, a, a, b, b, b, b] ...
然而,一般来说,这种方法可能以不公平的方式列举答案/解决方案;从而隐藏了简短的例子。为确保找到按长度排序的所有解决方案:
?- length(L,N), phrase(s,L).
在这种情况下,没有区别。但是可以考虑在所有其他规则之后添加规则符号(0,-->[])。
L=[]
不会显示在第一个查询中,它“被无限多个解决方案隐藏”,但会在第二个查询中显示为第一个解决方案
因此,在试图理解您给出的更复杂的示例之前,请考虑<代码> [a,b] < /代码>,因为这是最简单的例子。
另一种方法是剖析查询<代码>短语(S,L)< /代码>,并考虑其每一个组成部分:
?- phrase(symbols(Sem,a),L).
Sem = s(0),
L = [a] ;
Sem = s(s(0)),
L = [a, a] ;
Sem = s(s(s(0))),
L = [a, a, a]
所以这一部分加上与
b
相同的部分描述了整个句子。和s(end)
通常写为s(0)
。你是对的。谢谢。我明天要做一个关于这个的考试,这是我试图掌握的最后一个部分。你的回答很好,但我仍在努力理解这个概念。你有没有关于讨论这个问题的网站、教程、论文的链接,或者对我有帮助的链接?@RHK-S8:它是:一般语法,即上下文无关语法。然后把它翻译成序言从句。您可以通过列表看到这一点。因此,如果我将此文件保存为.pl文件,并将其加载到解释器中..您会键入什么来计算它,这样您就可以使用列表了?通过使用列表,我得到了…?-名单。s(A,D):-symbols(B,A,A,C),symbols(B,B,C,D)。然而,它似乎没有显示aaabb,或aabb,或ab。