【发布时间】:2011-11-26 23:36:43
【问题描述】:
免责声明:这是在我自己的时间完成的非正式且未经评估的课程。我自己试过了,失败了,现在正在寻找一些指导。
我正在尝试实现 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
我们被告知要使用剪辑“!”来执行此操作操作员,但我已经查看了我的课程笔记,以了解 cut 和更多在线内容,但仍然无法在我的脑海中点击!
到目前为止,我已经设法得到:
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 和 Programming in Prolog (Google Books)
关于如何在逻辑上应用剪辑的指导将是最有用的,但答案可能会帮助我自己弄清楚。
我们还被告知要使用另一种方法,该方法使用'\+' 否定失败,但希望一旦 cut 对我来说这可能会更简单?
【问题讨论】:
标签: prolog prolog-cut