创建“删除成员”;序言中的函数

发布于 2024-08-27 23:55:06 字数 428 浏览 5 评论 0原文

我是 Prolog 新手,我正在尝试创建一个函数,该函数将简单地从列表中删除元素的所有实例。以下代码是我到目前为止所拥有的:

remove([H|T], E, L2) :- (\+ ([H|T] == []) ->
    (H == E
        -> remove(T, E, L2)
        ; append(L2, H, L2), remove(T, E, L2)
    )
    ; append(L2, [])
).

当我运行此代码时:

remove([1,2,3,4,5], 3, L2).

我收到错误:

ERROR: Out of global stack

有人能指出我为什么会遇到此问题吗?

I am new to Prolog and I'm trying to to create function that will simply remove all instances of an element from a list. The following code is what I have so far:

remove([H|T], E, L2) :- (\+ ([H|T] == []) ->
    (H == E
        -> remove(T, E, L2)
        ; append(L2, H, L2), remove(T, E, L2)
    )
    ; append(L2, [])
).

When I run this code on:

remove([1,2,3,4,5], 3, L2).

i get an error:

ERROR: Out of global stack

Could someone point me to why I am getting this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

冷了相思 2024-09-03 23:55:06

这一说法

[H|T] == []

永远不可能成立,因为空列表永远不可能与包含至少一个元素的列表相同。

This statement

[H|T] == []

can never be true because an empty list can never be identical to a list that contains at least one element.

涙—继续流 2024-09-03 23:55:06

您需要的是 SWI 的 subtract 谓词:

 ?- subtract([1,1,2,3,1],[1,2],R).
R = [3].

 ?- listing(subtract).
lists:subtract([], _, []) :- !.
lists:subtract([A|C], B, D) :-
        memberchk(A, B), !,
        subtract(C, B, D).
lists:subtract([A|B], C, [A|D]) :-
        subtract(B, C, D).

true.

What you need is a SWI's subtract predicate:

 ?- subtract([1,1,2,3,1],[1,2],R).
R = [3].

 ?- listing(subtract).
lists:subtract([], _, []) :- !.
lists:subtract([A|C], B, D) :-
        memberchk(A, B), !,
        subtract(C, B, D).
lists:subtract([A|B], C, [A|D]) :-
        subtract(B, C, D).

true.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文