小编Nol*_*ter的帖子

理解Swi-prolog中的分裂

我有这个代码将输入列表分成两半.好像没问题.

halve(List,A,B) :- halve(List,List,A,B), !.
halve(B,[],[],B).
halve(B,[_],[],B).
halve([H|T],[_,_|T2],[H|A],B) :-halve(T,T2,A,B). 
Run Code Online (Sandbox Code Playgroud)

好的,所以我试着解码它.一开始很清楚:

"Halve采取列表和2个逻辑变量"是这样的:

halve(List,A,B) 
Run Code Online (Sandbox Code Playgroud)

(1)然后连续这部分:

:- halve(List,List,A,B).
Run Code Online (Sandbox Code Playgroud)

这意味着,我正在从第一个创建新的两个列表(列表,列表)或者什么?什么exacly代表": - "?我猜新的列表=一半是A,而B,对吧?

(2)第二,拜托,我不太了解这两行:

halve(B,[],[],B).
halve(B,[_],[],B).
Run Code Online (Sandbox Code Playgroud)

也许你可以在一些例子中解释一下,好吗?

(3)嗯,我希望在您对(1)和(2)的解释之后,我将自己得到最后的部分......

halve([H|T],[_,_|T2],[H|A],B) :- halve(T,T2,A,B). 
Run Code Online (Sandbox Code Playgroud)

非常非常感谢你帮助我.


好的,我们的第一个问题已经解决了.长话短说,它的工作原理如下:

halve([1,2,3,4,5],[1,2],[3,4,5]). 
->true
Run Code Online (Sandbox Code Playgroud)

如果你注意到它将列表分成两半,但如果列表中有奇数个元素,则后半部分是较大的元素.

现在我想要获得的是让第一个更大.

所以我在想这个:

我要达到这个目的:

Halves_div([1,2,3],A,B).
A=[1,2],
B=[3].
Run Code Online (Sandbox Code Playgroud)

假设我的输入是列表:[1,2,3].所以我将从分割列表的头部和尾部开始:[H|T]然后我将合并H新的空列表 - 我的上半部分(A).之后我有A = [1],B = []和输入= [2,3].

合并我有:

merge([],List,List).
merge([H|T],List,[H|New]) :- merge(T,List,New).
Run Code Online (Sandbox Code Playgroud)

还有一件事 - 我需要检查上半场是否已经> =下半场,对吧?

所以这是我的想法,我唯一能帮助你的是将它写在prolog中.我有点困惑如何把它放在一起.

谢谢!


看来我对解决方案的想法太复杂了,我找到了更好的东西!

list prolog

3
推荐指数
1
解决办法
3289
查看次数

删除SWI-Prolog中的元素或列表

另一个问题,我有一个很好的工作"功能"删除:

remove([],X,[]) :- !. 
remove([X|T],X,L1) :- !, remove(T,X,L1).         
remove([H|T],X,[H|L1]) :- remove(T,X,L1). 
Run Code Online (Sandbox Code Playgroud)

但它不能像我希望它一样工作.它删除元素甚至列表......

...但不会删除所有外观.这是目标:

remove([A,B,[C],[A,[B]],[[A,[B]]]],[A,[B]],X).
X=[A,B,[C],[]]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

prolog

2
推荐指数
1
解决办法
5835
查看次数

标签 统计

prolog ×2

list ×1