gpt4 book ai didi

prolog - 在 Prolog 中使用 cut 定义一个 once_member/2 函数

转载 作者:行者123 更新时间:2023-12-04 08:45:44 25 4
gpt4 key购买 nike

免责声明:这是在我自己的时间完成的非正式和未经评估的类(class)作业。我自己尝试过,失败了,现在正在寻找一些指导。

我正在尝试实现 member/2 函数的一个版本,它只会返回一个列表的成员一次。

例如:

| ?- member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
X = 1 ? ;

我希望它最多只打印出每个数字一次。
| ?- once_member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
no

我们被告知要使用“!”进行此操作。接线员,但我已经在网上查看了我的类(class)笔记以进行剪切和更多操作,但仍然无法让它在我的脑海中响起!

到目前为止,我已经设法得到:
once_member(E, [E | L]) :- !.
once_member(E, [_, L]) :-
once_member(E, L).

它返回 1,然后没有别的,我觉得我的剪辑在错误的地方并且阻止了每场可能的比赛的回溯,但我真的不知道下一步该去哪里。

我查看了我的类(class)笔记以及: http://www.cs.ubbcluj.ro/~csatol/log_funk/prolog/slides/5-cuts.pdfProgramming in Prolog (Google Books)

关于如何从逻辑上应用切割的指导将是最有用的,但答案可能会帮助我自己弄清楚。

我们还被告知要执行另一种方法,该方法通过失败使用 '\+' 否定,但希望一旦 cut 对我来说,这可能会更简单?

最佳答案

删除多余的答案并保持纯净!

我们定义 memberd/2基于 if_/3 and (=)/3 :

memberd(X, [E|Es]) :-   if_(X = E, true, memberd(X, Es)).

Particularly with meta-predicates, a different argument order may come in handy sometimes:

list_memberd(Es, X) :-
memberd(X, Es).

示例查询:
?- memberd(X, [1,2,3,1]).
X = 1 ;
X = 2 ;
X = 3 ;
false.

关于prolog - 在 Prolog 中使用 cut 定义一个 once_member/2 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8282460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com