List 序言列表位置

List 序言列表位置,list,location,prolog,List,Location,Prolog,我一直在编写这段代码,以查找位置并告诉我该位置是否存在。代码是: location(C, L). location(C, [C,L]|_]). location(C, [_|T]):- location(C,T,L). 如果C在L位置显示为胸部,我希望它是真的。输入以下代码: location(b,[(a, 1), (b,2)]). 当发现胸部位于该位置时,答案应为“是”。这确实会给我一个“是”,但当我将代码更改为: location(e, [(a,1)

我一直在编写这段代码,以查找位置并告诉我该位置是否存在。代码是:

    location(C, L).
    location(C, [C,L]|_]).
    location(C, [_|T]):- location(C,T,L).
如果C在L位置显示为胸部,我希望它是真的。输入以下代码:

    location(b,[(a, 1), (b,2)]).
当发现胸部位于该位置时,答案应为“是”。这确实会给我一个“是”,但当我将代码更改为:

   location(e, [(a,1), (b,2)]).

当我的回答应该是“否”时,我仍然会得到“是”。有人知道我遗漏了什么吗?

你好,我会尝试回答你的问题并指出你的错误。 你的第一行说任何C都是L的元素。在Prolog中,统一是从上到下,从左到右进行的。所以Prolog将始终统一该行,因此它将始终返回true。第二行和第三行包含语法错误。无论如何,下面是回答您问题的代码:

%这里我们说的是,没有一个箱子可以放在一个空的位置上

 location(_,[]) :- fail.
%如果我们设法找到一个包含C的头部,那是真的

location(C,[Head|_]) :- Head=(C,_).
%这里我们说如果C不等于某个东西(从头部看),试着在尾部寻找C

location(C,[Head|Tail]):- Head=(Something,_),not(Something = C),location(C,Tail).
您也可以通过以下方式解决它

%基本上你会问,L中是否有一个成员胸部,这样胸部=(C,u)。

location1(C,L) :- member(Chest,L),Chest=(C,_). 

这很有帮助,谢谢!