[英]Prolog A predicate for alignment
对齐是指谓词包含两个列表,其中三个包含对齐列表。 然后检查对齐列表中的每个项目的确是其他两个照明灯中的一个元素。 并且有关于顺序的要求,以便排除仅检查对齐列表中的每个项目是否都是其他两个输入灯的成员的可能性。 如果我只是检查成员,则当反向时有效的对齐方式也将有效。 当然哪个是错误的。
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)
一种简单的检查对齐方式是使用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]
[]
关键不是算法上的思考过多,而是要研究谓词为真的情况。
在这里,我将考虑对齐列表(第三个参数)为空且不为空的情况。 对于非空的情况,请描述输出列表的第一个元素必须保留的内容,并对其余列表使用递归。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.