Я пытаюсь решить одну из этих проблем логики сетки с помощью 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 (...) , чтобы они были уникальными, и это исправило проблему.