我是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)).
但是,当我尝试编译它时,出现错误:
最佳答案
第一个问题是您已经定义了以逗号结尾的事实,如上面已经提到的@Repeat。
其次,在用名称实例化的数组调用唯一谓词的地方,该程序是不正确的。例如,它看起来可能像unique([andrey,andrey,andrey,andrey]),接下来发生的事情是调用了unique,该调用使用member
调用(Head = andrey)
将会失败,因为它找不到member(andrey)
,但是可以找到member(room(,,,,))
,所以在这里,您缺少room
。如果您希望所有member
和not(member(,,,))
事实都必须成功,那么您需要创建一个新规则并将所有这些facts
放入该规则中。