0

プロローグで、「どこか左へ」という状況をどう表現するか。たとえば、リスト "List" と 2 つの用語 "X" と "Y" があり、規則を表す方法: X はリスト内の Y の左側にあります。

4

4 に答える 4

2

これは、サブシーケンス マッチングの問題に還元できます。

subsequence([], _).
subsequence([X|Sub], [X|Seq]) :-
    subsequence(Sub, Seq).
subsequence(Sub, [_|Seq]) :-
    subsequence(Sub, Seq).

次に、「左から」のクエリは になりますsubsequence([X, Y], List), !

于 2011-11-04T18:54:38.237 に答える
2

リストのいくつかのプロパティを記述したいとします。多くの場合、文法はこれに対処するための最良の方法です。

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

?- Xs = "abc", phrase((...,[X], ..., [Y], ...), Xs).
Xs = "abc",
X = a,
Y = b ;
Xs = "abc",
X = a,
Y = c ;
Xs = "abc",
X = b,
Y = c ;
false.
于 2011-11-08T16:19:11.600 に答える
1

それは多くの方法で行うことができます。
nth1(N,List,X) は、リストの N 番目の要素が X である場合に真となる述語です。

nth1 を使用した実装は非常に簡単です。私のコードを見る前に解決してみてください。

left(X,Y,L):-
    nth1(NX,L,X),
    nth1(NY,L,Y),
    NX<NY.

それを解決する他の方法は、append/3 を使用することです。

left(X,Y,L):-
   append(_,[X|T],L),
   member(Y,L).

または単純な再帰:

left(X,Y,[X|T]):-
   member(Y,T).
left(X,Y,[H|T]):-
   H=\=X,
   left(X,Y,T).
于 2011-11-04T21:49:32.773 に答える
0

すでに append/3 述語がある場合は、次を使用できます。

left(A,B,S) :-
    append(_,[B,A|_],S).

あなたが尋ねるなら:

?- left(1,2,[1,2,3,4]).
false.

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

-レオ

于 2011-11-04T19:47:34.377 に答える