Prolog 检查列表是否是序列的一部分

Prolog check if list is part of a sequence

我的任务是定义一个谓词来检查给定列表是否是序列的一部分。谓词有三个成员。前两个列表是序列的开始。每一个其他元素 L(N + 2),N >= 0 是 L(N) 和反向 L(N + 1) 的串联。我必须检查第三个参数是否是序列的一部分。

my-append([], L, L).
my-append([H|T], L, [H|R]) :- my-append(T, L, R).

list-len([], 0).
list-len([_|T], N) :- list-len(T, N1), N is N1 + 1.

my-reverse([], []).
my-reverse([H|T], R) :- my-reverse(T, R1), my-append(R1, [H], R).

compare-list([], []).
compare-list([H1|A], [H2|B]) :- H1 =:= H2, compare-list(A, B).

fib-list(A, B, C) :-
    my-reverse(B, B1),
    list-len(A, LenA),
    list-len(B1, LenB1),
    my-append(A, B1, C1),
    list-len(C, LenC),
    list-len(C1, LenC1),
    LenC1 =:= LenA + LenB1,
    (
        (LenC > LenC1, !);
        (LenC =:= LenC1, compare-list(C1, C));
        (LenC < LenC1, fib-list(B, C1, C))
    ).

这些是一些例子:

fib-list([1, 2], [4, 3], [4, 3, 4, 3, 2, 1]). % result is true
fib-list([1, 2], [4, 3], [4, 3, 4, 3, 2, 1, 4]). % result is true
fib-list([1, 2], [4, 3], [4, 3, 4, 3, 2]). % result is true

L1 = [1] 和 L2 = [2] 的示例序列; L3 = [1, 2]; L4 = L2 + 反转 (L3) = [2, 2, 1]; L5 = L3 + 反转 (L4) = [1, 2, 1, 2, 2]

预期结果:

fib-list([1], [2], [1, 2]). % true
fib-list([1], [2], [2, 2, 1]). % true
fib-list([1, 2], [4, 3], [1, 2, 3, 4]). % true

问题是第二次和第三次测试的结果是真的,我不知道为什么。

你想多了这个问题并命令式地使用 Prolog,就像使用 C 语言或其他命令式语言一样使用它。

首先描述您的谓词。您的 fib-list(A, B, C) 表示 CB 的反向开头附加到 A。所以就这样写:

fib-list(A, B, C) :-
    my-reverse(B, B1),          % B1 is reverse of B
    my-append(A, B1, C1),       % C1 is reverse of B (B1) appended to A
    my-append(C1, _, C).        % C is something/anything appended to C1
                                %   (C begins with C1)