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)
表示 C
以 B
的反向开头附加到 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)
我的任务是定义一个谓词来检查给定列表是否是序列的一部分。谓词有三个成员。前两个列表是序列的开始。每一个其他元素 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)
表示 C
以 B
的反向开头附加到 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)