2011-12-01 86 views
0

所以我必須編寫不同的程序來幫助我解決農民 - 狼 - 山羊 - 捲心菜肥料難題。對於那些不瞭解它的人來說,它涉及到一個農民必須與其他所有物體從一條河的北岸橫渡到南岸。銀行在以下三種情況下是安全的:農民在場,或者狼沒有留下山羊,或者山羊沒有留下捲心菜。爲了練習的目的,變量將是[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。銀行只是一個包含不同對象的列表。 –

回答

1

我無法測試,但現在我想,你可以寫這樣的:

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

相關問題