prolog - Prolog 中的逻辑
问题描述
所以,我在 prolog 上编写了删除函数的代码(从列表中删除 Val 并返回新的),起初我写了这个:
removal([], _, []).
removal([Val|T], Val, Y) :- removal(T, Val, Y).
removal([H | T], Val, Y) :- removal(T, Val, [Y, H]).
这对我来说很有意义:
- 如果列表为空,请停止
- 如果列表的头部等于该值,则跳过它
- 如果列表的头部不等于该值,则将其添加到 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 以相同的值开头。
你能解释一下为什么会这样吗?
解决方案
推荐阅读
- python - Django Runserver 错误:“OSError:[WinError 123] 文件名、目录名或卷标语法不正确:'
'" - excel - Excel Microsoft 365:仅奇数行中的 COUNTIF
- ios - Objective C 类方法`(unsigned long long)`
- ios - 平移 UIViewController 使固定到安全区域的东西跳转到超级视图
- javascript - 状态克隆过早更新
- c# - RGB 16 位精灵(C# 按位)
- ios - UIViewPropertyAnimator 开头有短动画片段
- javascript - 向后的图像滑块或轮播不起作用
- scala - Scala中泛型类型之间的比较
- javascript - 我试图让我的时间从 javascript 显示并继续计数(即 2:30:45 然后 2:30:46),我很难在这里'我当前的代码