0

在 Prolog 中,如何表示“左侧某处”的情况。例如,有一个List“List”和两个词“X”和“Y”,如何表示规则:X在List中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) 是一个谓词,如果 List 的第 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 回答