免责声明:这是在我自己的时间做的非正式和非评估课程。我自己尝试过,失败了,现在正在寻找一些指导。
我正在尝试实现 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
我们被告知要通过剪切“!”来做到这一点。操作员,但我已经查看了我的课程的笔记,以便在线查看更多内容,但仍然无法让它在我的脑海中点击!
到目前为止,我已经设法得到:
once_member(E, [E | L]) :- !.
once_member(E, [_, L]) :-
once_member(E, L).
返回 1 然后什么都没有,我觉得我的剪辑位置错误,并且阻止了每场可能的比赛的回溯,但我真的不确定下一步该去哪里。
我查看了我的课程笔记以及:http ://www.cs.ubbcluj.ro/~csatol/log_funk/prolog/slides/5-cuts.pdf和Prolog 中的编程(Google 图书)
关于如何在逻辑上应用削减的指导将是最有用的,但答案可能会帮助我自己弄清楚这一点。
我们还被告知要做另一种方法,该方法使用'\+' 否定失败,但希望一旦 cut 对我来说这可能会更简单?