List 序言在列表中按尾部插入数字
如何在prolog中构建一个接收数字和列表的谓词,我必须在列表的尾部插入数字List 序言在列表中按尾部插入数字,list,prolog,dcg,difference-lists,List,Prolog,Dcg,Difference Lists,如何在prolog中构建一个接收数字和列表的谓词,我必须在列表的尾部插入数字 我试着用头部插入列表中的数字:insert(H,[p | Q],[H,p | Q])。有效,但如何用尾部插入?在尾部插入可以用两部分递归规则完成: 当列表为空时,使用插入的项将结果统一到单个元素列表中 当列表不为空时,将结果统一到头部,然后是插入尾部的结果 英文描述比Prolog的对应词长得多: ins_tail([], N, [N]). ins_tail([H|T], N, [H|R]) :- ins_tail(
我试着用头部插入列表中的数字:
insert(H,[p | Q],[H,p | Q])。
有效,但如何用尾部插入?在尾部插入可以用两部分递归规则完成:
- 当列表为空时,使用插入的项将结果统一到单个元素列表中
- 当列表不为空时,将结果统一到头部,然后是插入尾部的结果
ins_tail([], N, [N]).
ins_tail([H|T], N, [H|R]) :- ins_tail(T, N, R).
只需像这样使用
append/3
:
?- append([a,b,c,d],[x],List).
List = [a,b,c,d,x].
?-附加([a,b,c,d],[x],列表)。
列表=[a、b、c、d、x]。
还没有人谈论过
差异列表
差异列表表示为L-E
,这只是一个方便的符号,用于表示由列表L
组成的一对夫妇,其最后一个cons单元格的尾部为E
:
L = [ V1, ..., Vn | E]
空的差异列表是E-E
,带有E
变量。只要您想优化列表,就可以统一E
。
例如,如果要添加元素X
,可以按如下方式统一:
E = [X|F]
然后,L-F
是新列表。同样,您可以在固定时间内追加列表。如果将F
与“正常”列表统一,特别是[]
,则关闭开放式列表。在所有操作期间,通过L
保留对整个列表的引用。当然,您仍然可以使用通常的[W1,…,Wm | L]-E
符号在L
前面添加元素
是否需要差异列表是另一个问题。如果在末尾添加元素实际上是您的常见操作,并且您正在处理大型列表,那么他们会很感兴趣
定分句语法
是在Prolog中编写语法规则的一种方便方法。它们通常实现为读卡器宏,将-->
表单转换为实际谓词。由于语法的目的是在解析过程中构建结构(也称为产品),因此实际谓词的转换涉及差异列表。因此,尽管这两个概念在理论上是不相关的,但差异列表通常是DCG的构建材料
维基百科上的示例以以下内容开头:
sentence --> noun_phrase, verb_phrase.
。。。它被翻译成:
sentence(S1,S3) :- noun_phrase(S1,S2), verb_phrase(S2,S3).
det([the|X], X).
语法提供了很多“管道”(有点像monad)。由语句/2
构建的对象是S1,它由谓词连接在一起的不同部分构建而成。S1被传递到名词短语
,该短语根据需要构建/扩展它,并“返回”S2,可以将其视为“扩展S1的任何内容”。该值被传递到动词短语
,该短语将对其进行更新,并给出S3,即扩展S2的值。S3是句子的一个参数,因为根据我们的规则,它也是“扩展S1的任何东西”但是,这是Prolog,因此S1、S2和S3不是必要的输入或输出,它们在整个过程中是统一的,在这个过程中,回溯也会发生(您可以解析不明确的语法)。它们最终与列表统一起来
当我们遇到箭头右侧的列表时,差异列表开始发挥作用:
det --> [the].
上述规则翻译为:
sentence(S1,S3) :- noun_phrase(S1,S2), verb_phrase(S2,S3).
det([the|X], X).
这意味着det/2
将其第一个参数与尾部为X
的开放式列表统一起来;其他规则将统一X
。通常,您可以找到与[]
关联的ε规则
以上所有操作都是通过宏完成的,一个典型的错误是尝试调用数据上的辅助谓词,这失败了,因为转换添加了两个参数(调用
helper(X)
实际上是调用helper(X,V,W)
)。必须将实际实体括在大括号中,以避免将预条件视为规则。这里是另一个选项
insert(N,[],[N]).
insert(N,[H|T],[H|Q]) :- conc([H|T],[N],[H|Q]).
conc([],L,L).
conc([H|T],L,[H|Q]) :- conc(T,L,Q).
你是说这个?”插入器(Q,[],[Q])。“插入(Q,[H | Q],[H,P | Q])。”我不明白it@BrianDanielGarc这几乎是正确的。我颠倒了列表和我的
ins_tail/3
规则中的项目,即首先是列表,然后是插入的项目,最后是结果。我如何在程序中调用?-insertarcola(4,[5,6,7],T)。@BrianDanielGarcía看一下链接的演示。电话在source.s(X)的第4行,感谢您的贡献!添加一些关于如何和关联的信息如何?那太棒了。