Prolog 有人能解释一下如何用定冠词语法统一答案吗?

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

我试图理解定句语法中的统一概念,是否有人能够一步一步地解释一个人是如何从下面的DCG中得到答案的

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。