首页 > 解决方案 > Prolog 中的逻辑

问题描述

所以,我在 prolog 上编写了删除函数的代码(从列表中删除 Val 并返回新的),起初我写了这个:

removal([], _, []).
removal([Val|T], Val, Y) :- removal(T, Val, Y).
removal([H | T], Val, Y) :- removal(T, Val, [Y, H]).

这对我来说很有意义:

  1. 如果列表为空,请停止
  2. 如果列表的头部等于该值,则跳过它
  3. 如果列表的头部不等于该值,则将其添加到 Y 列表的末尾,并继续没有它。

但是,我一直收到错误,直到我将其更改为:

removal([], _, []).
removal([Val|T], Val, Y) :- removal(T, Val, Y).
removal([H | T], Val, [H | Y]) :- removal(T, Val, Y).

几乎相同,除了第三步中的两件事:我们在列表 Y 的前面添加 H,即使(我认为)它应该添加到末尾;似乎我们在 lhs 中添加了它,但对我来说这感觉违反直觉,因为我认为我们检查 lhs 上的值,就像在第二步中我们检查是否 H == Val,所以就好像我们正在检查两者是否列表 X 和 Y 以相同的值开头。

你能解释一下为什么会这样吗?

标签: prolog

解决方案


推荐阅读