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

6 prolog dcg

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

sublist([1,2,4], [1,2,3,4,5,1,2,4,6]).
true
Run Code Online (Sandbox Code Playgroud)

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).  
Run Code Online (Sandbox Code Playgroud)

你能给我另一种解决方案吗?也许存在一些预定义的谓词my_equals

lur*_*ker 3

还有一种 DCG 方法可以解决该问题:

substr(Sub) --> seq(_), seq(Sub), seq(_).

seq([]) --> [].
seq([Next|Rest]) --> [Next], seq(Rest).
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方式调用:

phrase(substr([1,2,4]), [1,2,3,4,5,1,2,4,6]).
Run Code Online (Sandbox Code Playgroud)

您可以定义:

sublist(Sub, List) :-
    phrase(substr(Sub), List).
Run Code Online (Sandbox Code Playgroud)

所以你可以用 来称呼它sublist([1,2,4], [1,2,3,4,5,1,2,4,6]).


根据@mat的建议:

substr(Sub) --> ..., seq(Sub), ... .

... --> [] | [_], ... .
Run Code Online (Sandbox Code Playgroud)

是的,您可以有一个名为 的谓词...。:)


根据 @repeat 和 @false 的建议,我将名称从subseq(subsequence) 更改为substr(substring),因为“子序列”的含义包含非连续序列。

  • 好的!`... --> [] | [_],...`;-) (3认同)
  • `...//0` 在这里会很方便:`..., list(Sub), ...`。 (2认同)
  • @mat oy,我有时会很冗长。:) (2认同)
  • @重复我确实注意到在这篇[论文](https://www.complang.tuwien.ac.at/ulrich/papers/PDF/diss.pdf)中,第6页,它说,“`Es`必须是‘Es0’的*子序列*”作为连续的,所以也许我最初的用法是在好的公司。:) (2认同)