我实现了函数来获取列表的子列表,例如:
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
?
还有一种 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]).
。
substr(Sub) --> ..., seq(Sub), ... .
... --> [] | [_], ... .
Run Code Online (Sandbox Code Playgroud)
是的,您可以有一个名为 的谓词...
。:)
subseq
(subsequence) 更改为substr
(substring),因为“子序列”的含义包含非连续序列。