リストの 2 つのメンバーが隣接しているかどうかを確認する必要があります。制限は、append/3
述語を使用することです。これまでのところ、私は以下を行ってきました。それが本当であれば機能します。そうでなければ、答えが得られません。永遠に実行されるようです。
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
リストの 2 つのメンバーが隣接しているかどうかを確認する必要があります。制限は、append/3
述語を使用することです。これまでのところ、私は以下を行ってきました。それが本当であれば機能します。そうでなければ、答えが得られません。永遠に実行されるようです。
adjacent(X,Y,L):-
append(L1,[X,Y],T1),append(T1,T2,L).
プログラムがループすることを確認するには、次のfailure-sliceを検討するだけで十分です。
隣接(X、Y、L):- append(L1,[X,Y],T1), false ,append(T1,T2,L).
このプログラムがループする場合、元のプログラムもループします。成功するかもしれませんが、それでもループします。
最初の目標では、L1
との両方T1
がインスタンス化されていない変数です。これは、このフラグメントの他の場所では使用されていないため、簡単に確認できます。結果として、このプログラムは常にループX
しY
ますL
。これを修正するには、可視部分の何かを変更する必要があります。
1 つの可能性は、2 つのゴールを交換することです。しかし、さらに簡単な方法があります。
adjacent(X,Y,L) :-
append(_,[X,Y|_],L)
ただし、これはL
が実際に整形式のリストであることを保証するものではないことに注意してください。実際、adjacent(1,2,[1,2|nonlist])
成功します。リストにする必要がある場合:
adjacent(X,Y,L) :-
append(_,[X,Y|R],L),
append(R,[],R).
詳細については、 failure-sliceを参照してください。
これは最良の答えではないかもしれませんが、次の方法を試すこともできます。
adjacent(X,Y,Zs):- append(As,[X,Y|Ys],Zs).
例えば:
3 ?- adjacent(1,2,[1,2,3]).
true .
1 ?- adjacent(1,3,[1,2,3]).
false.