从Prolog中的列表中选择所有可能的选项
所以我必须编写不同的程序来帮助我解决农民 - 狼 - 山羊 - 卷心菜肥料难题。对于那些不了解它的人来说,它涉及到一个农民必须与其他所有物体从一条河的北岸横渡到南岸。银行在以下三种情况下是安全的:农民在场,或者狼没有留下山羊,或者山羊没有留下卷心菜。为了练习的目的,变量将是[f,b,g,w,c]。从Prolog中的列表中选择所有可能的选项
我被困住的程序涉及找到1或2个元素的列表(总是包括农民-f),它可能是银行运输的一部分而不会使其不安全。如果有人确实选择了([g,f,b],Items),则Items可能的返回值可以是[f],[f,g],[f,b]。但是,如果我们选择([g,f,c],Items),则返回的唯一可能值是[f,c]或[f,g],因为山羊和卷心菜不能放在一起。
因此,任何人都可以请给我一个提示如何获得项目的所有可能的选项,但列表不超过2项?
我无法测试,但现在我想,你可以写这样的:
choose(Bank, [f, Other]) :-
select(f, Bank, Rest),
select(Other, Rest, LeftBehind),
safe(LeftBehind).
choose(Bank, [f]) :-
select(f, Bank, LeftBehind),
safe(LeftBehind).
看起来不错,只是不要忘记你总是必须带着“f”与你。另外,你可以使用append/3吗?谢谢:) –
虽然我不明白一件事 - 项目最初是空的,为什么我们检查它是否是Bank的一个子集?另外,总是只需要从银行获得一个元素,另一个元素是f。 f总是在Bank中,否则不能进行运输。 –
你去了!现在它是正确的:) – m09
你能明确的变量名字好吗?目前还不清楚! – m09
变量名称只是对象的缩写 - 农民,狼,山羊,卷心菜,肥料袋b。银行只是一个包含不同对象的列表。 –