數學女孩 - 哥德爾不完備定理 - 學習筆記



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 個人

... To be continued.


留言

熱門文章