我正在尝试使用swi-prolog解决这些网格逻辑问题之一。我可以编写大多数规则,但是,这条规则使我感到震惊:
进行3天访问的大使将在进行9天访问的大使离开后1个月。
这是我一直在使用的代码:
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(...)中的变量重命名为唯一的,并且已解决了该问题。