數學女孩 - 哥德爾不完備定理 - 學習筆記
Prolog
第一章 :
問題 : A1~A5 五個人當中, 誠實的人是誰?
A1 : 這邊有一個人說謊
A2 : 這邊有兩個人說謊
A3 : 這邊有三個人說謊
A4 : 這邊有四個人說謊
A5 : 這邊有五個人說謊
程式 : github
possible_solution(Solution) :- length(Solution, 5), maplist(form_condition, Solution). form_condition(X) :- member(X, [istrue, isfalse]). how_many_lies([], 0). how_many_lies([X|T], N) :- X = istrue, how_many_lies(T, N1), N is N1 ; X = isfalse, how_many_lies(T, N2), N is N2 + 1. condition1([A,B,C,D,E]) :- A = istrue, how_many_lies([A,B,C,D,E], 1) ; A = isfalse, not(how_many_lies([A,B,C,D,E], 1)). condition2([A,B,C,D,E]) :- B = istrue, how_many_lies([A,B,C,D,E], 2) ; B = isfalse, not(how_many_lies([A,B,C,D,E], 2)). condition3([A,B,C,D,E]) :- C = istrue, how_many_lies([A,B,C,D,E], 3) ; C = isfalse, not(how_many_lies([A,B,C,D,E], 3)). condition4([A,B,C,D,E]) :- D = istrue, how_many_lies([A,B,C,D,E], 4) ; D = isfalse, not(how_many_lies([A,B,C,D,E], 4)). condition5([A,B,C,D,E]) :- E = istrue, how_many_lies([A,B,C,D,E], 5) ; E = isfalse, not(how_many_lies([A,B,C,D,E], 5)). question :- possible_solution(Solution), condition1(Solution), condition2(Solution), condition3(Solution), condition4(Solution), condition5(Solution), Solution=[A,B,C,D,E], write(A), write(', '), write(B), write(', '), write(C), write(', '), write(D), write(', '), write(E), nl.
執行結果 :
?- consult(wholies).
true.
?- question.
isfalse, isfalse, isfalse, istrue, isfalse
true ;
false.
---
延伸 : N 個人
留言
張貼留言