Пролог: Art Theft. Решение логической головоломки
Просто начать входить в Пролог, поскольку искусственный интеллект довольно интересен и отличается от многих других языков программирования, и я наткнулся на логическую головоломку:
http://www.brainbashers.com/showpuzzles.as
и интересно, как я мог начать писать такую головоломку?
Меня беспокоит то, что мы знаем о плохой информации, как бы вы строго выбрали их из списка людей?
2 ответа
Давайте предположим, что у нас есть список людей Persons
и список лжецов Liars
, Вы можете разбить проблему на два требования:
Liars
это "подсписок"Persons
: Нам нужен дополнительный предикат, напримерsublist(Persons,Liars)
:sublist([],[]). % base case: empty list sublist([H|T],[H|Rest]) :- sublist(T,Rest). % the sublist may contain H ... sublist([_|T],Rest) :- sublist(T,Rest). % ... or not
Есть ровно четыре лжеца:
length(Liars,4)
Теперь вы можете просто соединить это вместе:
length(Liars,4),sublist(Persons,Liars)
Я положил length(Liars,4)
впереди, потому что это детерминировано, тогда как sublist/2
создает точки выбора.
Этот код использует библиотеку SWI-Prolog (агрегат) для легкого подсчета...
s(a, b, d, e).
s(b, a, c, e).
s(c, b, f, e).
s(d, a, f, c).
s(e, c, d, f).
s(f, c, d, a).
count_lies(T, N) :-
aggregate_all(count, (s(_, X,Y,Z), (T==X;T==Y;T==Z)), N).
solve(P) :-
member(P, [a,b,c,d,e,f]), count_lies(P, 4).
тестовое задание:
?- solve(P).
P = c ;
false.