入力リストを半分に分割するためのこのコードがあります。大丈夫そうです。
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).
つまり、最初のリストから新しい2つのリスト(リスト、リスト)を作成しているということですか?「:-」を正確に表すものは何ですか?新しいリスト=半分はAとBになると思いますよね?
(2)次に、次の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).
そしてもう1つ-前半がすでに>=後半であるかどうかを確認する必要がありますよね?
ですから、これは私の考えであり、私があなたに助けてもらいたい唯一のことは、それをプロローグで書くことです。私はそれをどのように組み合わせるか少し混乱しています。
ありがとう!
私の解決策のアイデアは複雑すぎるようで、もっと良いものを見つけました!