在列表中搜索在序言中无限地获得真实

searching in list getting true infinitely in prolog

我尝试编写一个 Prolog 程序,该程序采用 2 值并计算该对是否有效。如果对在不同的列表中,则对将有效并且它们可以匹配。如果两个团队在同一个列表(组)中,那么他们无法进行匹配,这意味着错误。

当我启动程序时,它没有显示任何内容。我以为会有无限搜索或循环。然后尝试了那个简单的代码

GroupB=[china,usa,chile,italy].

member(X,[X|_]).
member(X,[_|T]):-
   member(X,T).

match(X):-
   member(X,GroupB).

在那个代码中,我看到那个程序总是给我正确的。我打字;对于 SWI-Prolog,它给了我另一个 true,我输入了;又一次是真的,然后我意识到问题应该出在那个搜索部分。感谢您从现在开始的所有兴趣。欢迎所有建议。

编辑: 我这样编辑代码以尝试不同的风格

GroupA([germany,brazil,turkey,korea]).
GroupB([china,usa,chile,italy]).

member(X,[X|_]).
member(X,[_|T]):-
   member(X,T).

memberence(X):-
   GroupA(L).
   GroupB(M).
   member(X,L).
   member(X,M).

collision(X,Y):-
   GroupA(L),
   member(X,L),
   member(Y,L).
   GroupB(L),
   member(X,L),
   member(Y,L).

match(X,Y) :-
   GroupA(L),
   memberence(X),
   memberence(Y),
   \+collision(X,Y).

现在我得到了: 错误:未定义的过程:match/2 错误:但是,有以下定义: 错误:catch/3

虽然有一个 match(X,Y) 过程为什么它给我未定义的 match/2 错误。

GroupA=[germany,brazil,turkey,korea].
GroupB=[china,usa,chile,italy].

member(X,[X|_]).
member(X,[_|T]):-
   member(X,T).

memberence(X):-
   member(X,GroupA).
   member(X,GroupB).

collision(X,Y):-
   member(X,GroupA),
   member(Y,GroupA).
   member(X,GroupB),
   member(Y,GroupB).

match(X,Y) :-
   memberence(X),
   memberence(Y),
   \+collision(X,Y).

一)

你有一个点必须是逗号:

collision(X,Y):-
   member(X,GroupA),member(Y,GroupA).
   member(X,GroupB),member(Y,GroupB).

b)

最好不要重新定义"member",这是标准的。

c)

如果我用逗号更改点:

collision(X,Y):-
  GroupA(L),member(X,L),member(Y,L),
  GroupB(L),member(X,L),member(Y,L).

此语句将始终失败,因为没有列表 "L" GroupA 和 GroupB 共有。

d)

如果我们接受原始请求 "takes 2 value and calculates if the pair is valid or not. If pairs are in different lists, then pairs will be valid and they can make match. If two team in same list(group) then they can't make match which means false."

解决方案似乎显而易见:

match(X,Y) :- groupA(A), member(X,A), groupB(B), member(Y,B).
match(Y,X) :- groupA(A), member(X,A), groupB(B), member(Y,B).

你有两个大问题。

  • 首先,您似乎可以互换使用.,

  • 其次,你没有理解Prolog的作用域规则。任何未断言到 prolog 数据库中的内容都限定在立即语句或谓词的子句中。如果你想让别人知道它,它要么是 prolog 数据库的一部分,要么作为参数传递。因此,当你说

    B组=[中国、美国、智利、意大利]。

变量GroupB与列表[china,usa,chile,italy]统一。此时,断言成功,新绑定的变量和与其统一的列表都 ** 超出范围 ** 并且不复存在。然后,当您稍后尝试引用它时:

GroupB=[china,usa,chile,italy].
.
.
.
match(X) :- member(X,GroupB).

变量GroupB未绑定。您对 member/2

的实施
GroupB=[china,usa,chile, 

member(X,[X|_]) .
member(X,[_|T]) :- member(X,T) .
当给定一个 unbound 变量作为它的第二个参数时,

非常愿意以 generative 方式行事,生成变量列表,在回溯上连续(并且无限)更长。