序言挑战

标签 prolog dcg

<分区>

我有以下子列表算法的实现。 问题:给定 2 个列表,确定一个是否是另一个的子列表。 我真的需要 Prolog 中的另一个独特的解决方案。

解决方法一:

sublist([H1|T1], L, [H2|T2]):-
  H1 = H2,
  sublist(T1, L, T2).
sublist([], _, _)
sublist([H1|T1],L,[H2|T2]):-
  sublist(L,L,T2).

方案二:

sublist([H|T], [H|L]):- check(T,L),
sublist(S, [H|T]):- sublist(S,T).
check([H|T], [H|R]):-
   check(T,R).
check([],_).

方案三:

sublist(S,L):-
  append(_,R,L),
  append(S,_,R).

方案三':

sublist(S,L):-
  append3(_,S,_,L).

最佳答案

?- phrase((...,seq(Sublist),...),List).

与:

... --> [] | [_], ... .

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

(警告:为了能够解释这个解决方案,您需要先了解 DCG!)

关于序言挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8270931/

相关文章:

prolog - 计算序言中术语中子术语的出现次数

Prolog - 如何仅断言/创建数据库一次

database - Prolog 做一个查询

parsing - Prolog 中的 DCG — 字符串

prolog - 定子句语法,如何检查字符串是否为字符?

prolog - Prolog 中谓词名称后面的双斜杠 `//` 出现在 DCG 上下文中的含义是什么?

prolog - 为什么 prolog 在简单的经典 member/2 实现中创建选择点?

list - 在序言中列出连续对

prolog - 试图在序言中理解解析器 DCG

prolog - 计算 Prolog 中的确定子句语法递归