我实现了获取列表子列表的函数,例如:
sublist([1,2,4], [1,2,3,4,5,1,2,4,6]).
true
sublist([1,2,4], [1,2,3,4,5,1,2,6]).
false
看看我的解决方案:my_equals([], _).
my_equals([H1|T1], [H1|T2]) :- my_equals(T1, T2).
sublist([], _).
sublist(L1, [H2|T2]) :- my_equals(L1, [H2|T2]); sublist(L1, T2).
你能给我另一个解决方案吗?也许存在一些预定义的谓词
my_equals
?
最佳答案
您可以使用 append/3 统一子列表, 像这样:
sublist(SubList, List):-
append(_, Tail, List),
append(SubList, _, Tail).
第一次调用
append/3
将 List 分成两部分(即从 List 中删除一些“领先”项目。第二次调用
append/3
将检查 SubList 本身是否是 Tail 的子列表。正如@false 所暗示的那样,至少在基本条件下,交换目标会更好,
sublist(SubList, List):-
append(SubList, _, Tail),
append(_, Tail, List).
关于prolog - 列表的子列表 - 替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37208968/