3

リストでとが隣り合っているかのように、 prologadjacent(X,Y,Zs)にルールを書き込もうとして います。trueXYZs

私は現在持っています:

append([],L,L).
append([H|T],L,[H|LT]):-append(T,L,LT).
sublist(S,L):-append(_,S,P),append(P,_,L).
adjacent(X,Y,Zs):-sublist([X,Y],Zs).

テスト:

1 ?- sublist([1,2],[1,2,3,4]).
true .

2 ?- sublist([1,3],[1,2,3,4,5]).
ERROR: Out of global stack
3 ?- 

何かアイデアはありますか?前もって感謝します。

4

3 に答える 3

4
adjacent(X,Y, [X,Y|_]).
adjacent(X,Y, [Y,X|_]). % remove this if you want just Y after X
adjacent(X,Y, [_|T]) :- adjacent(X,Y,T).

それはうまくいくはずです。

nextto(?X, ?Y, ?List)また、同じことを行うと呼ばれるリストライブラリに述語があります(ただし、この述語のセマンティクスは、任意の順序で単純に隣接するだけでなく、リストにY続くものであることに注意してください)。X

http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%27A.12%27,swi%28%27/doc/Manual/lists.html%27%29%29

于 2011-12-02T21:27:17.810 に答える
2

DCG を使用すると、可能な限り最もグラフィカルな方法で問題を表現できます。

... --> [] | [_], ... .

adjacent(X,Y,Seq) :- phrase((...,[X,Y],...), Seq).

編集: @fortran のコメントのおかげで、別の定義は次のようになります。

adjacent(X,Y,Seq) :- phrase((...,( [X,Y] | [Y,X] ),...), Seq).
于 2011-12-06T03:29:33.077 に答える