我有这个代码将输入列表分成两半.好像没问题.
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中.我有点困惑如何把它放在一起.
谢谢!
看来我对解决方案的想法太复杂了,我找到了更好的东西!
另一个问题,我有一个很好的工作"功能"删除:
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)
有任何想法吗?