我正在尝试为我正在处理的事情实现我自己的成员版本。截至目前,它看起来像这样:
search(X,[X | T]).
search(X, [H | T]) :-
search(X,T).
它似乎有效,但我有一些问题。我在T和H上得到一个单例警告。而且,我只是不确定代码实际上做了什么。根据我的理解
search(X,[X | T]).
第一个参数是我的目标,第二个参数是分成X的列表,然后是列表中的所有其他参数。
然后
search(X, [H | T]) :-
search(X,T).
我不确定发生了什么,除了它递归地调用自己。它是如何实际知道列表中的?任何澄清将不胜感激。
编辑:我想我现在明白了。我说当列表只包含我的目标时,第一行是真的。然后,我递归地浏览列表,直到唯一剩下的就是我的目标,在这种情况下它是真的。如果列表结束为空,那将是错误的。这是对的吗?
答案 0 :(得分:2)
理解Prolog的关键是理解代码的声明性读取。所以忘记 它现在如何工作,只考虑逻辑上说的是什么。
search(X, [X|T]).
这说
search(X, [X|T])
为真如果第一个参数且第二个参数的第一个项是相同的
" if"部分是模式匹配的工作原理。你得到一个单例变量警告,因为你从未使用过T
。 Prolog宁愿你写search(X, [X|_])
。
第二行说
如果search(X, [H|T])
为真,
search(X, T)
也是 true 。
您的其他单例变量警告在此处是因为您创建了变量H
,然后没有对其执行任何操作,因此Prolog更愿意看到search(X, [_|T]) :- search(X, T).
。
希望这有帮助!
答案 1 :(得分:2)
接受的答案很棒,我只想澄清你在编辑中添加的一些内容:
我说当列表只包含我的目标时,第一行是真的。然后,我递归地浏览列表,直到唯一剩下的就是我的目标,在这种情况下它是真的。如果列表结束为空,那将是错误的。这是对的吗?
当 列表包含我的目标"时,部件" ...为真。和#34;直到剩下的唯一的东西是我的目标" (强调我的)是不正确的,并提出一个小的误解。
相反,search(a, [a, b, c])
为真,因为目标是第二个参数中列表的第一个元素。这里a
不"唯一剩下的就是"在列表中。除了我们不需要关心的其他事情之外,这只是列表中出现的内容。
关于最后一部分你是对的:是的,当它到达列表末尾时搜索失败。