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