通过对齐我的意思是谓词有两个列表,三个带有对齐列表。然后检查对齐列表中的每个项目是否都是其他lits中的元素。并且需要关于顺序,因此排除仅检查对齐列表中的每个项目是否是其他输入lits的成员。如果我只检查成员,则有效对齐在反转时也有效。这当然是错的。
Example:
?- mxAli([4,2,9,8],[1,9,5,2,3,8],A).
A=[2,8] or A=[9,8]
8,2和8,9在这里无效。
当我想到如何实际检查订单时,我的脑袋会回归过于强制性的语言编程。任何输入都非常感谢。但是不要直接给出答案,我想要了解我应该阅读的内容。 (我需要这样说,因为我在这个网站得到了很好的帮助,如果我不指出这一点,那就太接近了。)
我的想法是,我或prolog需要在其当前元素的索引之后继续搜索。这会使反向对齐无效吗?
编辑:必须在两个列表中当前元素的索引之后继续搜索。如上例所示,当它找到2时,它开始搜索索引2和索引5处的下一个元素。(第一个元素为1)
答案 0 :(得分:2)
检查对齐的一种天真的方法是使用append/3
,例如:
append(_, [El | T1], L1),
append(_, [El | T2], L2),
...
其中L1
和L2
是给定列表,El
是他们必须共享的元素。
稍后您可以检查T1
和T2
是否对齐。
以下是完整的解决方案:
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]
[]
答案 1 :(得分:1)
关键不是在算法上思考太多,而是要经历谓词应该为真的情况。
这里我会考虑对齐列表(第三个参数)为空并且它不为空的情况。对于非空情况描述了输出列表的第一个元素必须保留的内容,并对列表的其余部分使用递归。