3

リストの 2 つのメンバーが隣接しているかどうかを確認する必要があります。制限は、append/3述語を使用することです。これまでのところ、私は以下を行ってきました。それが本当であれば機能します。そうでなければ、答えが得られません。永遠に実行されるようです。

adjacent(X,Y,L):-
   append(L1,[X,Y],T1),append(T1,T2,L).
4

2 に答える 2

6

を検討するだけで十分です。

    隣接(X、Y、L):-
       append(L1,[X,Y],T1), false ,
        append(T1,T2,L) .

このプログラムがループする場合、元のプログラムもループします。成功するかもしれませんが、それでもループします。

最初の目標では、L1との両方T1がインスタンス化されていない変数です。これは、このフラグメントの他の場所では使用されていないため、簡単に確認できます。結果として、このプログラムは常にループXYます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).

詳細については、 を参照してください。

于 2014-05-07T12:25:13.083 に答える
2

これは最良の答えではないかもしれませんが、次の方法を試すこともできます。

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.
于 2014-05-07T18:23:36.577 に答える