精選文章
數學女孩 - 哥德爾不完備定理 - 學習筆記
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 個人

留言
張貼留言