在Prolog中,如何在“左边某处”表示情况。 例如,有一个列表“列表”和两个术语“X”和“Y”,如何表示规则:X位于列表中Y左侧的某个位置。
答案 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