我想构建一个给出List
列表和带有坐标X的Element
的谓词,检查X是否属于该主List中的任何列表,如果它属于任何列表,则返回ReturnList
作为一个列表,其元素一直到找到元素X的位置。
例如,给定;
?-checklist((3,4),[[(1,3), (1,2), (1,1)],[(1,4), (2,4), (3,4), (4,4)]], ReturnList)
返回
ReturnList = [(1,4), (2,4), (3,4)]
我试图实现这一点,到目前为止我已经
了get_list([],_,[]).
get_list([List], Element, ReturnList):-
member(List, Element),
get_list(List|Rest, Element, List).
但这是我的第一个prolog程序之一,我发现很难理解逻辑
答案 0 :(得分:2)
我的解决方案(带注释)使用Prolog内置member/2
和append/3
:
checklist(Elem, List, ReturnList) :-
member(SubList, List), % SubList is contained in List
member(Elem, SubList), % Elem is contained in SubList
append(ReturnList, _, SubList), % ReturnList is a prefix of SubList
append(_, [Elem], ReturnList). % Elem is the last element of ReturnList
测试:
?- checklist((3,4),[[(1,3), (1,2), (1,1)],[(1,4), (2,4), (3,4), (4,4)]], ReturnList).
ReturnList = [(1, 4), (2, 4), (3, 4)] ;
false.