我正在学习Prolog,偶然发现了以下问题:Prolog - Seeing if the same element occurs in two lists。
此问题包括以下行:=(member(X,[H|T]), member[Z|Q]))
。
我知道member(?Elem, ?List),但我不理解member[Z|Q]
部分。这是什么意思?是不是有太多关闭的禁令?
答案 0 :(得分:2)
要点:
根本不用担心 。
以下是几个原因:
首先,这是无效语法。当您查阅链接到的程序时,您会得到:
ERROR: file.pl:5:28: Syntax error: Operator expected
准确表示包含以下内容的行:
=(member(X,[H|T]), member[Z|Q])),
其次,即使我们以某种方式修复有问题的语法,并将此行写为例如:
=(member(X,[H|T]), member_whatever),
然后它仍然非常可疑,这就是作者意味着表达的内容。
在这种情况下使用的谓词是(=)/2
,您可以使用中缀表示法将此等效地写为:
member(X,[H|T]) = member_whatever,
从这一点来看,很明显无法成功,因为(=)/2
甚至不适用于更一般的情况
member(_,_) = member_whatever,
所以,当然在上面更具体的案例中肯定也失败了!
在Prolog中编程时,请关注隐藏的清晰描述。
例如,要声明“两个列表中出现相同的元素”是直截了当的:
element_in_both(E, As, Bs) :- member(E, As), member(E, Bs).
就是这样!您可以按以下方式阅读:如果 E
是As
和的成员E
是Bs
的成员,然后 E
是的成员 As
和Bs
它非常普遍,例如:
?- length(Cs, _), append(As, Bs, Cs), element_in_both(E, As, Bs). Cs = [E, E], As = Bs, Bs = [E] ; Cs = [E, E, _2946], As = [E], Bs = [E, _2946] ; Cs = [E, _2940, E], As = [E], Bs = [_2940, E] .
您可以将此谓词用于生成此关系持有的列表,测试 是否适用一个特定的实例,完成部分列表,以便满足此谓词等。
所有这些都来自对条件的明确声明性描述,使这种关系 hold 。
在Prolog课程中,存在一种不必要地使这种相当简单的声明性编程基本原理复杂化的趋势。不要陷入这个陷阱。如果你的谓词变得复杂,你往往会忽略一些更简单的东西。