0

我正在尝试为学校做 Prolog 作业,基本上它是在尝试找出谁在哪个办公室。问题是:

Hunter、Laura、Jim、Sally 和 Jack 在与五个相邻办公室的同一栋大楼内工作。亨特不在第五办公室工作,劳拉不在第一办公室工作。Jim 不在第一个或最后一个办公室工作,而且他不在 Jack 或 Laura 旁边的办公室。莎莉在比劳拉更高的办公室工作。谁在什么办公室工作?

所以我拥有的是下面的代码,但我收到了:

uncaught exception: error(type_error(fd_evaluable,abs/1),(#\=)/2)

这是代码。

puzzle(P) :-
        findWhosOffice(P,Z),
        labeling([],Z).

findWhosOffice(P, Z) :-
        P = [hunter-Hunter, jack-Jack, jim-Jim, laura,Laura,sally,Sally],
        Z = [Hunter, Laura, Jim, Sally, Jack],

        Hunter #\= 5,
        Laura #\= 1,
        Jim #\= 1,
        Jim #\= 5,
        abs(Jim-Jack) #\=1,
        abs(Jim-Laura) #\=1,
        Sally #> Laura.

4

2 回答 2

0

问题是您还没有为 中的变量定义域Z。还缺少一个约束以使其成为有效且独特的解决方案。

于 2020-04-02T05:05:38.757 回答
0

这是我的解决方案,我看到你没有使用 all_different():

:-use_module(library(clpfd)).

puzzle(Employee,Employee_Office_Room):-
    Employee=[Hunter, Laura, Jim, Sally, Jack], Employee ins 1..5,
    Employee_Office_Room=[First,_Second,_Third,_Fourth,Fifth], Employee_Office_Room ins 1..5,
    all_different(Employee),
    all_different(Employee_Office_Room),
    
    Hunter#\=Fifth,
    Laura#\=First,
    Jim#\=First,
    Jim#\=Fifth,
    not_nextto(Jim,Laura),
    not_nextto(Jim,Jack),
    Sally#=Laura-1,
    labeling([],Employee),labeling([],Employee_Office_Room).
    
    not_nextto(A,B):-abs(A-B)#\=1.

?-puzzle(Employee,Employee_Office_Room).
Employee = [1, 4, 2, 3, 5],
Employee_Office_Room = [1, 2, 3, 4, 5]
Employee = [1, 4, 2, 3, 5],
Employee_Office_Room = [1, 2, 3, 5, 4]
Employee = [1, 4, 2, 3, 5],
Employee_Office_Room = [1, 2, 4, 3, 5]
Employee = [1, 4, 2, 3, 5],
Employee_Office_Room = [1, 2, 4, 5, 3]
Employee = [1, 4, 2, 3, 5],
Employee_Office_Room = [1, 2, 5, 3, 4]....
于 2020-12-08T16:12:47.827 回答