Compiler errors 序言:编译失败

Compiler errors 序言:编译失败,compiler-errors,prolog,Compiler Errors,Prolog,我是新来的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]):- mem

我是新来的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,andrey]),接下来发生的是调用unique,它调用
成员
,使用
(Head=andrey)
,这将失败,因为它找不到
成员(andrey)
,但它可以找到
成员(房间(,,)
,所以这里您缺少
房间
。如果您希望所有
member
not(member(,,,)
事实必须成功,那么您需要创建一个新规则,并将所有这些
事实
放在该规则中。

首先,可能会与内置谓词发生名称冲突,如
member/2
和/或
not/2
。请查看
member(room>)行(andrey,,,,,,Solve),
!它以
而不是
结尾。由于这些目标与所有其他子句处于同一水平,Prolog认为您正在试图定义一个谓词
(,)/2
,这可能不是您想要的…哦,顺便说一下,谓词说了(connectionj已经定义了。这个错误很常见,也不容易找到。糟糕!我在每个函数
成员
非成员
之后添加了
,但是现在我在重新定义内置谓词成员/2
时出现了错误。你的第二个意思是我应该添加
非成员(房间)(grisha,grisha,grisha,grisha,Solve)),
适用于每个人和这个
成员(房间(,,,)
?看,你正在调用
唯一的
谓词,其名称列表如下:
唯一([X,Y,Z,W])
所有这些变量都用某个名称实例化(X=andrey,Y=andrey,Z=andrey,W=andrey)因此,在unique rule prolog中,您可以这样看
unique(andrey | Tail=Y,Z,W)
,此时您将调用
成员(Head=andrey,Tail)
,这将不会成功,因为没有类似于
成员(andrey,Tail)
。您应该将其更改为
unique([H | Tail]):-member(房间(H,|,|,|,|,|,|,|,|,|,|,Tail),unique(Tail).
顺便说一句,我不知道你想做什么。如果你确切地告诉我你想要什么,我会尽力帮助你。:-)