我只是在学习Prolog,偶然发现了以下问题:Prolog - Seeing if the same element occurs in two lists。会员[H | T]是什么意思?
此问题包括以下行:=(member(X,[H|T]), member[Z|Q]))
。
我知道member(?Elem, ?List),但我不明白member[Z|Q]
部分。这是什么意思?是不是有太多关闭的假设?
我只是在学习Prolog,偶然发现了以下问题:Prolog - Seeing if the same element occurs in two lists。会员[H | T]是什么意思?
此问题包括以下行:=(member(X,[H|T]), member[Z|Q]))
。
我知道member(?Elem, ?List),但我不明白member[Z|Q]
部分。这是什么意思?是不是有太多关闭的假设?
摘要:
在所有不要担心这个。
这里有几个原因:
首先,这是无效语法。当您咨询您链接到该程序,您可以:
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].
您可以使用此谓词来产生名单,其中这种关系持有,以测试是否它适用于特定的实例,到完成部分列表这样他们满足这个谓词 等
所有这一切都从的条件,使这个关系 持有明确的声明说明如下。
在Prolog课程中,有一种不必要的复杂化这个相当简单的声明式编程基本原理的倾向。不要陷入这个 陷阱。如果你的谓词变得复杂,你往往会忽略更简单的东西。
哇,感谢您对语法错误的长时间的详细解释!仍然学到了一些新的东西(''你可以用这个谓词来生成这个关系成立的列表」) –
是的,这是逻辑编程的主要吸引力之一:从纯粹的说明性描述中,你可以**生成**满足关系。这对编写测试用例很有用,而且也可以简单地研究谓词:如果你想找出谓词的含义,可以尝试最普通的查询(其中所有参数都是变量),然后向Prolog请求* any *答案!这对于更多地了解谓词非常方便,并且在实践中非常有用,因为它使您的代码非常灵活和紧凑。 – mat