Prolog - 列表和匿名变量

时间:2014-05-18 03:11:05

标签: arrays list prolog

我有两个列表,例如L1 = [yellow, green, _, blue]L2 = [green, yellow, blue, red],我需要创建第三个列表,其中L1中的anonnymous变量,(_) ,被L2中缺少的单词替换,位于完全相同的位置......类似这样的内容L3 = [yellow, green, red, blue]

1 个答案:

答案 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”的感觉。但就是这样,我希望它对你有帮助。