比较Prolog中的数字变量时出现问题

时间:2019-02-26 20:44:47

标签: prolog logic

我正在尝试使用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(...)中的变量重命名为唯一的,并且已解决了该问题。

0 个答案:

没有答案