【发布时间】:2014-01-23 09:30:41
【问题描述】:
我有这段代码用于将输入列表分成两半。好像没问题。
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).
好的,所以我尝试对其进行解码。开头很清楚:
“将列表和 2 个逻辑变量减半”是这样的:
halve(List,A,B)
(1) 接续这部分:
:- halve(List,List,A,B).
这意味着,我正在从第一个列表创建新的两个列表(列表、列表)还是什么?什么exacly 代表“:-”?我猜新的列表 = 一半将是 A 和 B,对吧?
(2) 第二,拜托,这两行我不太明白:
halve(B,[],[],B).
halve(B,[_],[],B).
也许你可以用一些例子来解释一下,好吗?
(3) 嗯,希望经过你对(1)和(2)的解释,我能自己搞定最后一部分……
halve([H|T],[_,_|T2],[H|A],B) :- halve(T,T2,A,B).
非常非常感谢你帮助我。
好的,我们的第一个问题已经有了解决方案。长话短说,它的工作原理是这样的:
halve([1,2,3,4,5],[1,2],[3,4,5]).
->true
如果您注意到它会将列表分成两半,但如果列表的元素数为奇数,则后半部分是较大的部分。
现在我想要的是让第一个更大。
所以我在想这个:
我要达到这个目标:
Halves_div([1,2,3],A,B).
A=[1,2],
B=[3].
假设我的输入是列表:[1,2,3]。因此,我将从拆分列表的头部和尾部开始:[H|T],然后将H 与新的空列表合并——我的第一半(A)。
之后我有 A=[1]、B=[] 和 Input=[2,3]。
对于合并我有:
merge([],List,List).
merge([H|T],List,[H|New]) :- merge(T,List,New).
还有一件事 - 我需要检查第一半是否已经 >= 第二半,对吧?
所以这是我的想法,我希望你能帮助我的唯一一件事就是把它写在 prolog 中。我有点困惑如何把它放在一起。
谢谢!
看来我的解决方案太复杂了,我找到了更好的方法!
【问题讨论】:
-
你不知道“:-”代表什么?你有没有在 prolog 中编写过任何程序?
-
好吧,好吧...“could_be_wrong(X) :-human(X)。”该子句可以理解为“如果 X(我)是人类,X(我)可能会出错”。