Проблемы со сравнением числовых переменных в Прологе - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь решить одну из этих проблем логики сетки с помощью swi-prolog.Я могу запрограммировать большинство правил, однако это правило сбивает меня с толку:

Посол с 3-дневным визитом уйдет через 1 месяц после посла с 9-дневным визитом.

Вот код, который я использовал:

solution(X) :- 
    % Instatiate the lists
    ...
    % Generate all possible solutions
    ...
    % Format the variables as solutions table
    X = [[M1, Dm1, Dr1, C1],
         [M2, Dm2, Dr2, C2],
         [M3, Dm3, Dr3, C3],
         [M4, Dm4, Dr4, C4],
         [M5, Dm5, Dr5, C5]],

    ...

    % Rule in question
    % Month1, Month2, Days1, Days2 
    % are all instantiated as integers

    forall((member([Month1, _, Days1, _], X), 
            member([Month2, _, Days2, _], X),
            Days1=3, Days2=9),
            (Y is Month2 + 1, Month1 = Y)).

Проблема возникает, когда я генерирую решения, и первое из них:

S = [[5, owens, 10, helsinki], 
     [6, nguyen, 9, kiev], 
     [7, fitzgerald, 2, athens], 
     [8, howell, 6, brussels], 
     [9, vasquez, 3, paris]]

второй ряд и список строк нарушают правило, и я не могу понять всю жизнь, в чем проблема.Это вполне может быть сама логика, но я думаю, что мне трудно понять, как арифметика используется в прологе.

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

Редактировать:

Это код, имеющий отношение к проблеме.Я переименовал переменные выше для ясности, и их оригинальные имена были частью проблемы:

solution(X) :- 
    % Instatiate the lists 
    % Durations and Months are lists of integers
    diplomats(Diplomats),
    durations(Durations), 
    capitals(Capitals),
    months(Months),

    % Generate all possible solutions
    % (brute force)
    permutation([Dm1, Dm2, Dm3, Dm4, Dm5], Diplomats), 
    permutation([Dr1, Dr2, Dr3, Dr4, Dr5], Durations),
    permutation([C1, C2, C3, C4, C5], Capitals),
    [M1, M2, M3, M4, M5] = Months,

    % Format the variables as solutions table
    X = [[M1, Dm1, Dr1, C1],
         [M2, Dm2, Dr2, C2],
         [M3, Dm3, Dr3, C3],
         [M4, Dm4, Dr4, C4],
         [M5, Dm5, Dr5, C5]],

    %Rule 1
    forall(member([M, Dm, Dr, C], X), 
           rule1(M, Dm, Dr, C)),

    % Rule 2
    forall(member([M, _, Dr, _], X),
           rule2(M, Dr)),

    % ...


    % Rule in question
    % Month1, Month2, Days1, Days2 
    % are all instantiated as integers

    forall((member([M1, _, Dr1, _], X), 
            member([M2, _, Dr2, _], X),
            Dr1=3, Dr2=9),
           (Y is M2 + 1, M1 = Y)).

Проблема в том, что я использовал имена переменных и это вызвало конфликты.Я переименовал переменные в каждом forall (...) , чтобы они были уникальными, и это исправило проблему.

...