我正在尝试在序言中写一条规则adjacent(X,Y,Zs)
,如果true
和X
在列表Y
中彼此相邻,则为Zs
。
我目前有:
append([],L,L).
append([H|T],L,[H|LT]):-append(T,L,LT).
sublist(S,L):-append(_,S,P),append(P,_,L).
adjacent(X,Y,Zs):-sublist([X,Y],Zs).
测试:
1 ?- sublist([1,2],[1,2,3,4]).
true .
2 ?- sublist([1,3],[1,2,3,4,5]).
ERROR: Out of global stack
3 ?-
你们有什么主意吗?提前致谢。
最佳答案
adjacent(X,Y, [X,Y|_]).
adjacent(X,Y, [Y,X|_]). % remove this if you want just Y after X
adjacent(X,Y, [_|T]) :- adjacent(X,Y,T).
那应该工作。
同样,您在列表库中有一个谓词
nextto(?X, ?Y, ?List)
,该谓词将执行相同的操作(但请记住,该谓词的语义是Y
紧随列表中的X
,而不仅仅是以任何顺序简单相邻)。http://www.swi-prolog.org/pldoc/doc_for?object=section%282,%27A.12%27,swi%28%27/doc/Manual/lists.html%27%29%29