Prolog差异列表-合并排序

Prolog差异列表-合并排序,prolog,difference-lists,Prolog,Difference Lists,我必须编写谓词,将一个列表拆分为两个列表(减半): 这很容易,但现在我必须编写算法来进行合并排序-我不知道。此算法必须使用差异列表 请帮忙。不,很不幸,这并不“容易”,因为它不起作用对半([1,2,3]-[],A,B)不起作用将pom减半([1,2,3]-[],A,B)也不起作用。此外,还不清楚您喜欢哪种拆分方案,[1,2,3,4,5,6,7]->([1,3,5,7],[2,4,6])或->([1,2,3,4],[5,6,7]) 如果您的减半谓词起作用,您所要做的就是定义合并,它将按顺序合并列表

我必须编写谓词,将一个列表拆分为两个列表(减半):

这很容易,但现在我必须编写算法来进行合并排序-我不知道。此算法必须使用差异列表

请帮忙。

不,很不幸,这并不“容易”,因为它不起作用<代码>对半([1,2,3]-[],A,B)不起作用<代码>将pom减半([1,2,3]-[],A,B)也不起作用。此外,还不清楚您喜欢哪种拆分方案,
[1,2,3,4,5,6,7]->([1,3,5,7],[2,4,6])
->([1,2,3,4],[5,6,7])

如果您的
减半
谓词起作用,您所要做的就是定义
合并
,它将按顺序合并列表的两部分。那么

请注意,您可能会使用普通列表
a
调用它,即
halve
谓词应将其第一个参数预期为普通列表(即不是差异列表)

另见。
'-'
是不必要的;相反,它的两个成分应该用作谓词的两个独立参数


因此,将代码减半的一种方法是

halve([A,B|C],[A|X]-ZX,[B|Y]-ZY):- halve(C,X-ZX,Y-ZY). 
halve([A],[A|X]-X,Y-Y). 
halve([],X-X,Y-Y).
同样的方法可用于编码
合并

merge(SB,SC,S-Z):- SB=[A|B], SC=[C|D], A=<C, S=[A|T], merge(B,SC,T-Z).
merge(SB,SC,S-Z):- SB=[A|B], SC=[C|D], A>C,  ... ,    ... .
merge(SB,SC,S-Z):- SB=[A|B], SC=[],          ... ,    ... .
merge(SB,SC,S-Z):- SB=[], SC=[C|D],          S=[C|T], ... .
merge([],[],Z-Z).
merge(SB,SC,S-Z):-SB=[A | B],SC=[C | D],A=C。
合并(SB,SC,S-Z):-SB=[A | B],SC=[]。
合并(SB,SC,S-Z):-SB=[],SC=[C | D],S=[C | T]。
合并([]、[]、Z-Z)。
不,很不幸,这并不“容易”,因为它不起作用<代码>对半([1,2,3]-[],A,B)
不起作用<代码>将pom减半([1,2,3]-[],A,B)
也不起作用。此外,还不清楚您喜欢哪种拆分方案,
[1,2,3,4,5,6,7]->([1,3,5,7],[2,4,6])
->([1,2,3,4],[5,6,7])

如果您的
减半
谓词起作用,您所要做的就是定义
合并
,它将按顺序合并列表的两部分。那么

请注意,您可能会使用普通列表
a
调用它,即
halve
谓词应将其第一个参数预期为普通列表(即不是差异列表)

另见。
'-'
是不必要的;相反,它的两个成分应该用作谓词的两个独立参数


因此,将代码减半的一种方法是

halve([A,B|C],[A|X]-ZX,[B|Y]-ZY):- halve(C,X-ZX,Y-ZY). 
halve([A],[A|X]-X,Y-Y). 
halve([],X-X,Y-Y).
同样的方法可用于编码
合并

merge(SB,SC,S-Z):- SB=[A|B], SC=[C|D], A=<C, S=[A|T], merge(B,SC,T-Z).
merge(SB,SC,S-Z):- SB=[A|B], SC=[C|D], A>C,  ... ,    ... .
merge(SB,SC,S-Z):- SB=[A|B], SC=[],          ... ,    ... .
merge(SB,SC,S-Z):- SB=[], SC=[C|D],          S=[C|T], ... .
merge([],[],Z-Z).
merge(SB,SC,S-Z):-SB=[A | B],SC=[C | D],A=C。
合并(SB,SC,S-Z):-SB=[A | B],SC=[]。
合并(SB,SC,S-Z):-SB=[],SC=[C | D],S=[C | T]。
合并([]、[]、Z-Z)。

对于我的启发,您能否演示如何使用奇偶分割方案,使用差异列表进行
减半/3
?非常感谢。谢谢我以一种模糊的、概念化的方式“获得”DLs,但显然不足以实际使用它们。@DanielLyons我想就是这样。很好,你问了,结果我不得不把它修好一点。另请参见@DanielLyons乐于提供帮助。相反,让我投票表决你的评论;感觉一样好。:)书中使用了太模糊的语言,使这些东西变得不必要的困难。只要称之为“开放式列表”,一切都简单明了!我提出了一个使用触发器/触发器累加器的解决方案,而不是三种情况:
halve([],X-X,Y-Y)。对半([A | C],[A | X]-ZX,Y-ZY):-halve(C,Y-ZY,X-ZX)。
。如果您有时间看一看,我想听听您的反馈意见。您能告诉我如何使用奇数/偶数分割方案使用差异列表进行
halve/3
?非常感谢。谢谢我以一种模糊的、概念化的方式“获得”DLs,但显然不足以实际使用它们。@DanielLyons我想就是这样。很好,你问了,结果我不得不把它修好一点。另请参见@DanielLyons乐于提供帮助。相反,让我投票表决你的评论;感觉一样好。:)书中使用了太模糊的语言,使这些东西变得不必要的困难。只要称之为“开放式列表”,一切都简单明了!我提出了一个使用触发器/触发器累加器的解决方案,而不是三种情况:
halve([],X-X,Y-Y)。对半([A | C],[A | X]-ZX,Y-ZY):-halve(C,Y-ZY,X-ZX)。
。如果你有时间看的话,我想听听你的反馈。