Пролог: Art Theft. Решение логической головоломки

Просто начать входить в Пролог, поскольку искусственный интеллект довольно интересен и отличается от многих других языков программирования, и я наткнулся на логическую головоломку:

http://www.brainbashers.com/showpuzzles.as

и интересно, как я мог начать писать такую ​​головоломку?

Меня беспокоит то, что мы знаем о плохой информации, как бы вы строго выбрали их из списка людей?

2 ответа

Решение

Давайте предположим, что у нас есть список людей Persons и список лжецов Liars, Вы можете разбить проблему на два требования:

  1. 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
    
  2. Есть ровно четыре лжеца:

    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.
Другие вопросы по тегам