0

对齐是指谓词包含两个列表,其中三个带有对齐列表。然后检查对齐列表中的每个项目确实是其他两个灯中的一个元素。并且有关于顺序的要求,因此排除了仅检查对齐列表中的每个项目是否是其他两个输入灯的成员。如果我只检查成员,则有效的对齐方式在反转时也是有效的。这当然是错的。

Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]

8,2 和 8,9 在这里无效。

当我想到如何实际检查顺序时,我的脑袋又回到了命令式语言编程中。非常感谢任何输入。但是不要直接给出答案,我想要关于我应该阅读的内容的提示。(我需要这么说,因为我在这个站点上得到了很好的帮助,如果我不指出这一点,它就太接近作弊了)。

我的想法是 I 或 prolog 需要在其当前元素的索引之后继续搜索。那会使反向对齐无效吗?

编辑:在两个列表中当前元素的索引之后,它必须继续搜索。如上例,当它找到 2 时,它开始在索引 2 和索引 5 处搜索下一个元素。(第一个元素为 1)

4

2 回答 2

1

检查对齐的一种天真的方法是使用append/3,即:

append(_, [El | T1], L1),
append(_, [El | T2], L2),
...

whereL1L2是给定的列表,并且El是它们必须共享的元素。稍后您可以检查是否T1T2对齐。

以下是完整的解决方案:

align(L1, L2, [El | T]) :-
    append(_, [El | T1], L1),
    append(_, [El | T2], L2),
    align(T1, T2, T).

align(_L1, _L2, []).

% Test, executed at consult time
:- align([4,2,9,8], [1,9,5,2,3,8], Alignment), writeln(Alignment), fail; true.

测试打印出来:

[2, 8]
[2]
[9, 8]
[9]
[8]
[]
于 2009-10-31T09:56:31.517 回答
1

关键不是在算法上思考太多,而是通过谓词应该为真的情况。

在这里,我将考虑对齐列表(第三个参数)为空且不为空的情况。对于非空情况,描述输出列表的第一个元素必须保留的内容,并对列表的其余部分使用递归。

于 2009-11-01T12:37:59.417 回答