Это четвертая статья из серии статей о кодировании вопросов LSAT на языке программирования Ergo Lite. Чтобы начать сначала, перейдите к вступительному посту.

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

Вопрос 6 звучит так:

6. Что из следующего может быть полным и точным описанием порядка показа фильмов на фестивале?
(A) Четверг: В центре внимания, затем Урожай; пятница: центр внимания; Суббота: Сбор урожая
(B) Четверг: Сбор урожая; Пятница: Жадность, затем Центр внимания; Суббота: В центре внимания, затем Жадность
(C) Четверг: Урожай; пятница: центр внимания; Суббота: В центре внимания, затем Жадность
(D) Четверг: Жадность, затем Жатва, затем В центре внимания; пятница: центр внимания; Суббота: Жадность
(E) Четверг: Жадность, затем Урожай; пятница: центр внимания, затем урожай; Суббота: сбор урожая

Итак, чтобы ответить на этот вопрос, нам нужно создать эти расписания в коде и спросить, является ли каждое из них действительным расписанием.

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

Итак, здесь нам нужно закодировать расписание, указанное в каждом ответе, а затем спросить, правильный ли этот ответ.

Чтобы потом было удобно проверять правильные ответы, мы будем использовать выражение question(1,a), означающее, что правильный ответ на вопрос 1 — это ответ (а).

Итак, сначала мы изложили расписание выше:

q1a:Schedule[screenings->{
        \#:Screening[day->Thursday,film->Limelight,slot->First],
        \#:Screening[day->Thursday,film->Harvest,slot->Second],
        \#:Screening[day->Friday,film->Limelight,slot->First],
        \#:Screening[day->Saturday,film->Harvest,slot->First]
    }].

Затем мы создаем правило, согласно которому правильным ответом на вопрос 6 является ответ (а), если только что созданное расписание, называемое q1a, действительно.

question(6,a) :-
    q1a:ValidSchedule.

Вот и все. Теперь мы можем спросить, верно ли, что правильным ответом на вопрос 6 является ответ (а), используя запрос question(6,a).. И интерактивный рассудок Ergo Lite скажет No.

Итак, мы продолжаем с четырьмя другими вариантами.

q1b:Schedule[screenings->{
        \#:Screening[day->Thursday,film->Harvest,slot->First],
        \#:Screening[day->Friday,film->Greed,slot->First],
        \#:Screening[day->Friday,film->Limelight,slot->Second],
        \#:Screening[day->Saturday,film->Limelight,slot->First],
        \#:Screening[day->Saturday,film->Greed,slot->Second]
    }].
question(6,b) :-
    q1b:ValidSchedule.
q1c:Schedule[screenings->{
        \#:Screening[day->Thursday,film->Harvest,slot->First],
        \#:Screening[day->Friday,film->Limelight,slot->First],
        \#:Screening[day->Saturday,film->Limelight,slot->First],
        \#:Screening[day->Saturday,film->Greed,slot->Second]
    }].
question(6,c) :-
    q1c:ValidSchedule.
q1d:Schedule[screenings->{
        \#:Screening[day->Thursday,film->Greed,slot->First],
        \#:Screening[day->Thursday,film->Harvest,slot->Second],
        \#:Screening[day->Thursday,film->Limelight,slot->Third],
        \#:Screening[day->Friday,film->Limelight,slot->First],
        \#:Screening[day->Saturday,film->Greed,slot->First]
    }].
question(6,d) :-
    q1d:ValidSchedule.
q1e:Schedule[screenings->{
        \#:Screening[day->Thursday,film->Greed,slot->First],
        \#:Screening[day->Thursday,film->Harvest,slot->Second],
        \#:Screening[day->Friday,film->Limelight,slot->First],
        \#:Screening[day->Friday,film->Harvest,slot->Second],
        \#:Screening[day->Saturday,film->Harvest,slot->First]
    }].
question(6,e) :-
    q1e:ValidSchedule.

И теперь вместо того, чтобы спрашивать, доказано ли каждое из них, мы можем спросить «какой правильный ответ на вопрос 6», используя запрос question(6,?x).. Интерактивный рассудок Ergo Lite ответит:

?X = c
1 solution(s) in 0.000 seconds; elapsed time = 0.001
Yes

Таким образом, правильный ответ на вопрос 6 - c.

И мы можем это подтвердить. Ответ в (а) вообще не показывает Жадность. Ответ в (b) показывает и Жадность, и Центр внимания в пятницу. В ответе (d) «Урожай» не является последним фильмом в четверг. Ответ в (e) не показывает последний раз Limelight в пятницу. Только (с) верно.

Вы можете удивиться, почему Ergo Lite отвечает «да» на этот вопрос. Это потому, что каждый запрос (и условие правила) в Ergo Lite неявно представляет собой вопрос в форме «есть ли в базе данных какие-либо объекты, для которых верны все следующие вещи?» Если они есть, он скажет «Да», а если их нет, он скажет «Нет». Если вы спросите, что они собой представляют, оно также скажет вам, что они собой представляют. Но вы также можете сказать Ergo Lite, что вы не хотите знать, что это такое, вы просто хотите знать, существуют ли они, поставив знак подчеркивания перед всеми именами переменных, которые вам не интересны.

Таким образом, запрос question(6,?_x). просто даст вам:

Times (in seconds): elapsed = 0.001; pure CPU = 0.000
Yes

Итак, мы начали отвечать на вопросы. Но это был самый простой вариант, потому что он не добавлял никаких сложностей к правилам, а просто давал нам фактические сценарии. Вопрос 7 попросит нас сказать, что верно или неверно для всех действительных графиков, так что наши данные тестирования станут полезными.

Джейсон Моррис — кандидат юридических наук в области вычислительного права на юридическом факультете Университета Альберты, оператор Round Table Law и соучредитель Lemma Legal Consulting. С ним можно связаться по адресу @RoundTableLaw в Твиттере. Если вам нужна помощь в том, чтобы заставить компьютеры заниматься юриспруденцией, не стесняйтесь обращаться к нам.