偵探調查罪案---採用程序計算

偵探調查了罪案的四位證人。從證人的話偵探得出的結論是:如果男管家說的是真話,那麼廚師說的也是真話;廚師和園丁說的不可能都是真話;園丁和雜役不可能都在說謊;如果雜役說真話,那麼廚師在說謊。偵探能判定這四位證人分別是在說謊還是在說真話嗎?

package main

import (
	"fmt"
)

func main() {
	getBool := func(v int) bool {
		if v == 0 {
			return false
		}
		return true
	}

	for a := 0; a <= 1; a++ {
		for b := 0; b <= 1; b++ {
			for c := 0; c <= 1; c++ {
				for d := 0; d <= 1; d++ {
					err := logic(getBool(a), getBool(b), getBool(c), getBool(d))
					if err == nil {
						fmt.Printf("管家:%t, 廚師:%t, 園丁:%t, 雜役:%t\n", getBool(a), getBool(b), getBool(c), getBool(d))
					}
				}
			}
		}
	}
}


func logic(a /*管家*/, b /*廚師*/, c /*園丁*/, d /*雜役*/ bool) error {
	if a && !b {
		return fmt.Errorf("如果男管家[%t]說的是真話,那麼廚師[%t]說的也是真話", a, b)
	}

	if b && c {
		return fmt.Errorf("廚師[%t]和園丁[%t]說的不可能都是真話", b, c)
	}

	if !c && !d {
		return fmt.Errorf("園丁[%t]和雜役[%t]不可能都在說謊", c, d)
	}

	if d && b {
		return fmt.Errorf("如果雜役[%t]說真話,那麼廚師[%t]在說謊", d, b)
	}
	return nil
}
管家:false, 廚師:false, 園丁:false, 雜役:true
管家:false, 廚師:false, 園丁:true, 雜役:false
管家:false, 廚師:false, 園丁:true, 雜役:true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章