2016-11-21 102 views

回答

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是  AsE成员是  Bs成员则EAs和  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课程中,有一种不必要的复杂化这个相当简单的声明式编程基本原理的倾向。不要陷入这个 陷阱。如果你的谓词变得复杂,你往往会忽略更简单的东西。

+0

哇,感谢您对语法错误的长时间的详细解释!仍然学到了一些新的东西(''你可以用这个谓词来生成这个关系成立的列表」) –

+2

是的,这是逻辑编程的主要吸引力之一:从纯粹的说明性描述中,你可以**生成**满足关系。这对编写测试用例很有用,而且也可以简单地研究谓词:如果你想找出谓词的含义,可以尝试最普通的查询(其中所有参数都是变量),然后向Prolog请求* any *答案!这对于更多地了解谓词非常方便,并且在实践中非常有用,因为它使您的代码非常灵活和紧凑。 – mat