2017-12-10 5 views
1

私は、プロローグに偶数の変数を含むリストを2つの半分に分割して入れ替える述語を書いています。たとえば、[a、b、c、d]→[c、d、a、b]などです。Prolog:リストの2つの半分を入れ替えよう

append([], List, List). 
append([Head|Tail], List, [Head|Rest]) :- 
    append(Tail, List, Rest). 

divide(L, X, Y) :- 
    append(X, Y, L), 
    length(X, N), 
    length(Y, N). 

swap([], []). 
swap([A], D) :- 
    divide(A, B, C), 
    append(C, B, D). 

私は、これが逆の順序で一緒にそれらを追加し、リストに「D」変数を割り当て、次に、2つの小さな等しいサイズのリストに[A]を分割することによって動作するように期待されます。

私が得意とするのは「偽」ですが、なぜこれは機能しませんか?
私は非常にプロローグの新機能ですので、これは愚かな/簡単な質問、ありがとう!

答えて

2

swap([a,b,c,d],[c,d,a,b])が失敗する理由です。そして、ここで実際の理由です:

 
?- swap([_/*a*/,_/*b*/|_/*,c,d*/],_/*[c,d,a,b]*/). 

:- op(950, fy, *). 
*(_). 

swap([], _/*[]*/). 
swap([A], D) :- 
    * divide(A, B, C), 
    * append(C, B, D). 

だから、だけではなく、元のクエリが失敗しないが、それでもこの一般化も同様に失敗します。あなたが依頼しても、

?- swap([_,_|_],_). 
false. 

あなたはただ失敗します。それを見ますか?

また、他の方法でも聞くことができます。

したがって、最初の引数は空のリストまたは1つの要素のリストのみでなければなりません。あなたは確かに長いリストも記述したいと思う。

関連する問題