从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项?

+0

你能明确的变量名字好吗?目前还不清楚! – m09

+0

变量名称只是对象的缩写 - 农民,狼,山羊,卷心菜,肥料袋b。银行只是一个包含不同对象的列表。 –

我无法测试,但现在我想,你可以写这样的:

choose(Bank, [f, Other]) :- 
    select(f, Bank, Rest), 
    select(Other, Rest, LeftBehind), 
    safe(LeftBehind). 
choose(Bank, [f]) :- 
    select(f, Bank, LeftBehind), 
    safe(LeftBehind). 
+0

看起来不错,只是不要忘记你总是必须带着“f”与你。另外,你可以使用append/3吗?谢谢:) –

+0

虽然我不明白一件事 - 项目最初是空的,为什么我们检查它是否是Bank的一个子集?另外,总是只需要从银行获得一个元素,另一个元素是f。 f总是在Bank中,否则不能进行运输。 –

+0

你去了!现在它是正确的:) – m09