我有两个列表,例如L1 = [yellow, green, _, blue]
和L2 = [green, yellow, blue, red]
,我需要创建第三个列表,其中L1
中的anonnymous变量,(_
) ,被L2
中缺少的单词替换,位于完全相同的位置......类似这样的内容L3 = [yellow, green, red, blue]
。
答案 0 :(得分:0)
我怀疑这是作业,因为它确实没有意义。 _
代表Prolog中的变量,但你不能用你描述的那些东西。请注意,你的问题的逻辑表述是不可能的。
你可以做的一件事就是达到同样的效果,就是将一个列表中的东西与另一个列表中的东西统一起来。这个谓词可以完成这项任务:
match_up([], []).
match_up(L1, L2) :-
select(X, L1, L1_Remaining),
select(X, L2, L2_Remaining),
match_up(L1_Remaining, L2_Remaining).
这个谓词基本上说,在L1中找到一个元素,在L2中找到相应的元素,并尝试递归处理余数。但是,要使用它来解决您的问题,您必须尝试它并查看变量是否在过程中收到了绑定。它确实发生了:
main :-
L1 = [yellow, green, _, blue],
L2 = [green, yellow, blue, red],
match_up(L2, L1),
write(L1).
如果你运行它,你会得到所需的输出:
?- main.
[yellow,green,red,blue]
你也得到了一堆更相同的解决方案(~24?),因为你将这些元素剥离出来的顺序并不重要。它们只是相同的,因为这个特定的没有含糊之处配对,但你可以想象其他配对会有歧义。
这不是使用Prolog的好方法。如果需要引用变量,请为它们命名。这个问题有点不对称。我对代码有一种“icky”的感觉。但就是这样,我希望它对你有帮助。