2017-12-09 27 views
2

関数matchFirstTwo(List1, List2)の次の規則を組み込んだプロローグ規則を書き込もうとすると、最初のリストの最後の2つの要素= 2番目のリストの要素AppendとReverseをソリューションに実装することはできません。 matchFirstTwo(List1, List2) —がList2の最後の二つの要素最初のリストの最後の2つの要素= 2番目のリストの最初の2つの要素 - プロローグ

% Example : 
?- matchFirstTwo([a,b,c,d],[d,c,a,b]). 
    true. 
+0

'matchFirstTwo([a]、[a])'はどうでしょうか? – false

+0

'List2の第1要素と第2要素は等しいです.'再帰を使用していますが、長さが2に達すると、単純にそれらを比較します。 –

+2

@TomasBy:編集することで、編集に時間がかかります。むしろ投稿を編集する前に2kを得る! – false

答えて

2

の第一及び第二の要素がList1に等しい「正確にいつ成功

last([X], X). 
last([_|Z], X) :- last(Z, X). 

nextToLast([X,_], X). 
nextToLast([_|Z], X) :- nextToLast(Z, X). 

書き込みは、ここでは、広く利用可能なリスト述語を使用してmatchFirstTwo/2を定義することができます方法は次のとおりです。

matchFirstTwo(List1, List2) :- 
    append([X,Y], _, List2),  % List2's first and second elements 
    append(_, [Y,X], List1).  % equal List1's last two elements 

または、よりコンパクトに:

matchFirstTwo(List1, [Y,X|_]) :- 
    append(_, [X,Y], List1). 

または、さらに良い:

matchFirstTwo(List1, [Y,X|_]) :- 
    reverse(List1, [Y,X|_]). 

サンプルクエリ:

?- matchFirstTwo([a,b,c,d], [d,c,a,b]). 
true          % succeeds deterministically 
1

あなたは2の長さを持っている場合は、最初のリストのと同じ時間減少の長さでヘッドを取り外してください単に解決策を確認してください。 2番目のリストの最初の2つの要素を持つ最初のリストの最後の2つの要素を比較しようとしていると

append/3なし

reverse/2

matchFirstTwo(List1,List2):- 
     length(List1,X), 
     match(List1,X,List2). 

match(List1,2,List2):- 
    compare(List1,List2),!. 

match([_|T],Len,List2):- 
    NewLength is Len - 1, 
    match(T,NewLength,List2). 

compare([H1,H2|_],[H1,H2|_]). 

次の例のクエリは、間違いがあります。したがって、2番目のリストはtrueになるためには[c,d,a,b]になっている必要があります。