prolog - 列表的子列表 - 替代方法

标签 prolog dcg

我实现了获取列表子列表的函数,例如:

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/

相关文章:

prolog - 自动显示结果?

numbers - prolog 将数字转换为罗马数字

prolog - 为文件输入创建 dcg 的一般模式是什么?

prolog - Prolog DCG限制

parsing - Prolog DCGs 多个功能?

prolog - 在列表中的单独行上打印

prolog - SWI-prolog中的动态规则声明

prolog - 关于 Prolog 语法

prolog - 使用 www_open_url/1

Prolog DCG set_prolog_flag double_quotes 源代码指令位置很重要;文件?