会员[H | T]是什么意思?

时间:2016-11-21 22:27:52

标签: prolog

我正在学习Prolog,偶然发现了以下问题:Prolog - Seeing if the same element occurs in two lists

此问题包括以下行:=(member(X,[H|T]), member[Z|Q]))

我知道member(?Elem, ?List),但我不理解member[Z|Q]部分。这是什么意思?是不是有太多关闭的禁令?

1 个答案:

答案 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).

就是这样!您可以按以下方式阅读:如果 EAs 的成员EBs 的成员,然后 E的成员 AsBs

它非常普遍,例如:

?- 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课程中,存在一种不必要地使这种相当简单的声明性编程基本原理复杂化的趋势。不要陷入这个陷阱。如果你的谓词变得复杂,你往往会忽略一些更简单的东西。