Пролог: решение головоломки

Я новичок в прологе, и я пытаюсь решить следующий вопрос. Мне трудно понять логику решения проблемы. Я знаю, что это похоже на проблему с зеброй, но я не знаю, как подойти. Любая помощь будет принята с благодарностью.

Ответы, представленные пятью студентами в викторине T / F, следующие.

Teresa: T T F T F
Tim:    F T T T F
Tania:  T F T T F
Tom:    F T T F T
Tony:   T F T F T
  1. Таня получила больше правильных ответов, чем Тереза.
  2. Том получил больше прав, чем Тим.
  3. Тони не все ответы дал правильно, и не все понял неправильно.

Напишите программу на Прологе quiz(Answer), которая утверждает, что ответ - это список констант t и f, который является правильным ответом на викторину.


person mayak    schedule 29.01.2015    source источник
comment
Звучит как забавная головоломка. Почему вы хотите испортить это себе, обманывая, прося решения здесь?   -  person wvdz    schedule 30.01.2015
comment
Похоже, есть два возможных ответа ..   -  person Eugene Sh.    schedule 30.01.2015
comment
Я не ищу решения, мне просто нужна помощь, чтобы понять его логику. Последовательность шагов, которые я потенциально мог бы использовать.   -  person mayak    schedule 30.01.2015
comment
Подумайте, какие факты излагаются в первую очередь (каждый ученик со своими ответами), и решите, как вы хотите их представить. Например, answers(teresa, [t,t,f,t,f]). и т. Д. Вы можете создать предикат, чтобы генерировать возможные наборы правильных ответов и вычислять по нему оценку каждого человека. Возврат, если условия для сравнения результатов не совпадают. На самом деле результат только один.   -  person lurker    schedule 30.01.2015


Ответы (2)


Если вы используете SWI-Prolog, вы можете использовать библиотеку clpfd для решения головоломки:, я получаю только одно решение (f, f, t, f, t).

У вас есть решение [A, B, C, D, E]. Вы инициализируете возможные решения с помощью

[A,B,C,D,E] ins 0..1,

Например, вы овеществуете все ответы для Терезы

teresea([1,1,0,1,0]).
A #= 1 #<==> TA
B #= 1 #<==> TB
.....

вы вычисляете сумму Tis

sum([TA, TB, ...], #= , Steresa),

и позже у вас будет для Таня получила больше правильных ответов, чем Тереза ​​.

Stania #> Steresa

Вы получаете решение с

label([A,B,C,D,E]).

Надеюсь это поможет

person joel76    schedule 30.01.2015
comment
Спасибо за публикацию. Это очень помогло мне разобраться и запустить проблему. Теперь я практикую больше подобных задач. Это был мой первый вопрос по stackoverflow :) - person mayak; 02.02.2015
comment
Если вы согласны с этим ответом, нажмите, чтобы принять его - person joel76; 02.02.2015

маленькие головоломки, подобные этой, могут быть решены путем создания и тестирования

solve(L) :-
    % generator
    length(L, 5), maplist(tf, L),

    % Tania got more answers right than Teresa did.
    matches(L, tania, Tania),
    matches(L, teresa, Teresa), Tania > Teresa,
...

tf(t).
tf(f).

teresa(t, t, f, t, f).
tim(f, t, t, t, f).
...

Конечно, matches(L, tania, Tania) считается правильным ответом Тани.

Но я не нахожу решения. Единственный кортеж, который "проходит" Тони, это его точный результат. Итак, это условие

Тони не получил правильных ответов

не может быть решена ...

edit У меня была ошибка в матчах / 3. Конечно, выход есть.

edit ну, версия CLP (FD) может быть очень компактной, но более общей ...

teresa(t, t, f, t, f).
...

matches(L, P, N) :-
    call(P, A,B,C,D,E),
    foldl(eqsum, [A,B,C,D,E], L, 0, N).
eqsum(t,Ls,Acc,N) :-    N #= Acc + (° #<==> Ls #= 1).
eqsum(f,Ls,Acc,N) :-    N #= Acc + (° #<==> Ls #= 0).

solve(L) :-
    length(°L, 5) ins 0..1,
    % Tania got more answers right than Teresa did.
    matches(L, tania, °) #> matches(L, teresa, °),
    % Tom got more right than Tim.
    matches(L, tom, °) #> matches(L, tim, °),
    % Tony did not get all the answers right, nor did he get them all wrong.
    matches(L, tony, °Tony) #> 0, Tony #< 5.

Я использовал здесь свой подъемник.

person CapelliC    schedule 30.01.2015