PROLOG:推理过程,为什么returns false
PROLOG: process of inference, why returns false
我有conc
的定义:
conc([], L2, L2).
conc([X1|R1], L2, [X1|RN]) :-
conc(R1, L2, RN).
我不明白为什么 conc([X | green], Y, [red, green, blue]).
returns false
而不是
X = [red],
Y = [blue]
这里推理的过程是怎样的?
免责声明:我不了解 Prolog。这个答案的其余部分是一个有根据的猜测。
您提出的 X = [red]
解决方案没有意义,因为这会使 X
成为单元素列表。让我们假设
X = red
相反。
那会给我们
conc([red | green], [blue], [red, green, blue]).
用 conc
的第二个等式变成
conc(R1, L2, RN).
% with:
% X1 = red
% R1 = green
% L2 = [blue]
% [X1|RN] = [red, green, blue]
% i.e. X1 = red
% RN = [green, blue]
即
conc(green, [blue], [green, blue]).
现在我们陷入困境,因为 none 的 conc
规则适用于 green
。
问题是 [X | green]
因为 green
不是列表的尾部。
您是说 [X, green]
吗?
在 Prolog 列表表示法中,|
将其左侧枚举的元素与其右侧剩余元素的 列表 分开。问题出在您的查询中。您需要写 [X | [green]]
或 [X,green]
而不是 [X | green]
。使用这些修复程序之一,您将获得正确答案。例如
?- conc([X | [green]], Y, [red, green, blue]).
X = red,
Y = [blue].
我有conc
的定义:
conc([], L2, L2).
conc([X1|R1], L2, [X1|RN]) :-
conc(R1, L2, RN).
我不明白为什么 conc([X | green], Y, [red, green, blue]).
returns false
而不是
X = [red],
Y = [blue]
这里推理的过程是怎样的?
免责声明:我不了解 Prolog。这个答案的其余部分是一个有根据的猜测。
您提出的 X = [red]
解决方案没有意义,因为这会使 X
成为单元素列表。让我们假设
X = red
相反。
那会给我们
conc([red | green], [blue], [red, green, blue]).
用 conc
的第二个等式变成
conc(R1, L2, RN).
% with:
% X1 = red
% R1 = green
% L2 = [blue]
% [X1|RN] = [red, green, blue]
% i.e. X1 = red
% RN = [green, blue]
即
conc(green, [blue], [green, blue]).
现在我们陷入困境,因为 none 的 conc
规则适用于 green
。
问题是 [X | green]
因为 green
不是列表的尾部。
您是说 [X, green]
吗?
在 Prolog 列表表示法中,|
将其左侧枚举的元素与其右侧剩余元素的 列表 分开。问题出在您的查询中。您需要写 [X | [green]]
或 [X,green]
而不是 [X | green]
。使用这些修复程序之一,您将获得正确答案。例如
?- conc([X | [green]], Y, [red, green, blue]).
X = red,
Y = [blue].