我是prolog的新手,所以如果解决简单,请原谅。
“成员”工作之前的第一部分代码没有任何编译错误。
之后,我不知道指令是否正确编写。当我尝试添加说明“谁可以在一起或不能在一起”时,出现编译错误。

solve(Solve):-
  Solve = [room(X, Y, Z, W)],
  man(X), man(Y), man(Z), man(W), unique([X, Y, Z, W]).

unique([]):-!.
unique([Head|Tail]):-
   member(Head, Tail), !, fail;
   unique(Tail).

man(andrey).
man(boris).
man(kostya).
man(vasya).
man(dima).
man(yura).
man(fedya).
man(grisha).


member(room(andrey, _, _, _), Solve),
member(room(vasya, _, _, _), Solve),
member(room(boris, kostya, _, _), Solve),
member(room(dima, yura, _, _), Solve),
member(room(fedya, dima, grisha, _), Solve),
member(room(fedya, dima, kostya, _), Solve),
member(room(yura, boris, _, _), Solve),
member(room(yura, fedya, _, _), Solve),
member(room(yura, grisha, kostya, _), Solve),
not(member(room(kostya, vasya, _, _), Solve)),
not(member(room(grisha, boris, kostya, _), Solve)),
not(member(room(grisha, andrey, _, _), Solve)),
not(member(room(grisha, vasya, _, _), Solve)),
not(member(room(yura, andrey, _, _), Solve)),
not(member(room(yura, vasya, _, _), Solve)).

但是,当我尝试编译它时,出现错误:
  • prog.pl:22-37:致命错误:重新定义控件构造(',')/2
  • 最佳答案

    第一个问题是您已经定义了以逗号结尾的事实,如上面已经提到的@Repeat。

    其次,在用名称实例化的数组调用唯一谓词的地方,该程序是不正确的。例如,它看起来可能像unique([andrey,andrey,andrey,andrey]),接下来发生的事情是调用了unique,该调用使用member调用(Head = andrey)将会失败,因为它找不到member(andrey),但是可以找到member(room(,,,,)),所以在这里,您缺少room。如果您希望所有membernot(member(,,,))事实都必须成功,那么您需要创建一个新规则并将所有这些facts放入该规则中。

    07-25 23:24