0

我一直在研究此代码以查找位置并告诉我该位置是否存在。代码是:

    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)]).

当它应该说“不”时,我仍然得到“是”。有谁知道我错过了什么?

4

1 回答 1

0

您好,我会尽力回答您的问题并指出您的错误。你的第一行说任何 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 中是否有一个成员 Chest,使得 Chest=(C,_)。

location1(C,L) :- member(Chest,L),Chest=(C,_). 
于 2012-11-28T20:01:06.800 回答