Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 序言在列表中按尾部插入数字_List_Prolog_Dcg_Difference Lists - Fatal编程技术网

List 序言在列表中按尾部插入数字

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(

如何在prolog中构建一个接收数字和列表的谓词,我必须在列表的尾部插入数字


我试着用头部插入列表中的数字:
insert(H,[p | Q],[H,p | Q])。
有效,但如何用尾部插入?

在尾部插入可以用两部分递归规则完成:

  • 当列表为空时,使用插入的项将结果统一到单个元素列表中
  • 当列表不为空时,将结果统一到头部,然后是插入尾部的结果
英文描述比Prolog的对应词长得多:

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行,感谢您的贡献!添加一些关于如何和关联的信息如何?那太棒了。