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