从Prolog中的List中选择所有可能的选项

时间:2011-12-01 16:32:44

标签: list prolog forall river-crossing-puzzle

所以我必须编写不同的程序来帮助我解决农夫 - 狼 - 山羊 - 白菜 - 肥料之谜。对于那些不了解它的人,它涉及一个农民不得不从一条河的北岸穿过所有其他物体到南岸。银行在3种情况下是安全的:农民在场,或者狼没有留下山羊或者,山羊不会留下白菜。出于练习的目的,变量将是[f,b,g,w,c]。

我坚持的程序(选择(银行,项目))涉及查找1或2个元素的列表(总是包括农民-f),这可能是来自银行的运输的一部分而不会使其不安全。

如果选择([g,f,b],Items),则可能的项目返回值为[f],[f,g],[f,b]。但是,如果我们选择([g,f,c],Items),返回的唯一可能值是[f,c]或[f,g],因为山羊和卷心菜不能一起留下。

因此,有人可以给我一个提示,告诉我如何获得物品的所有可能选项,但列表不超过2项?

1 个答案:

答案 0 :(得分:1)

我现在无法测试,但我想你可以写一些类似的东西:

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