如何在prolog中表示“左边的某个地方”?

时间:2011-11-04 18:39:43

标签: prolog rule dcg

在Prolog中,如何在“左边某处”表示情况。 例如,有一个列表“列表”和两个术语“X”和“Y”,如何表示规则:X位于列表中Y左侧的某个位置。

4 个答案:

答案 0 :(得分:2)

这可以简化为子序列匹配的问题。

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

然后您的“左侧”查询将为subsequence([X, Y], List), !

答案 1 :(得分: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.

答案 2 :(得分:1)

它可以通过多种方式完成 nth1(N,List,X)是一个谓词,如果List的第N个元素是X,则为true。

使用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).

答案 3 :(得分: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

-Leo