【问题标题】:Member in combination with recursion成员结合递归
【发布时间】:2016-08-06 21:57:33
【问题描述】:

我在大学学习 Prolog,并在家庭练习中不断发现一些相当奇怪的东西。我编写了以下 Prolog 子句,它们是更大程序的一部分:

edges(X,Edges):-
    findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges).

edgesList([],_).
edgesList([node(X)|InL],OutL):-
    member((node(X),Edges),OutL),
    edges(X,Edges),
    edgesList(InL,OutL).

使用以下事实:

highway(1,2,yellow). 
highway(2,3,blue). 
highway(1,3,yellow).

您可以将高速公路视为一个事实,它在前两个参数中描述了两个节点,在第三个参数中描述了一条边。所有事实共同构成一个连通图。

使用边列表,我想列出每个节点的边,例如

Result = [(node(1),[yellow,yellow]),(node(2),[blue,yellow]),(node(3),[blue,yellow])]

但是当我写我的查询时:

edgesList([node(1),node(2),node(3)],List).

我得到以下结果:

List = [(node(1),[yellow, yellow]), (node(2),[blue, yellow]), (node(3),[blue, yellow])|_G610]

出于某种原因,Prolog 不会将结果列表的尾部与空列表统一起来,尽管我认为成员谓词使用正确。这种事情现在在不同的练习中发生了几次,很高兴知道我做错了什么......

【问题讨论】:

  • 如果OutL 是一个变量,则基本上有无限数量的列表member((node(X),Edges),OutL) 为真。在 Prolog 提示符下,看看如果您执行 member(a, L). 并在每个结果后按 ;(请参阅下一个答案)会发生什么。此外,您的基本情况 edgesList([],_). 不正确。 _ 并不意味着 nothing,而是意味着 anything,因为 _ 是一个匿名变量。 [] 的边缘列表是什么样的?当然不是_(任何东西)。

标签: prolog computer-science unification declarative-programming


【解决方案1】:

问题出在子句中:

edgesList([],_).

因为最后它会用未实例化的尾部 (|_G610) 填充列表。

一个解决方案是:

edges(X,Edges):-
    findall(Edge,(highway(X,Y,Edge);highway(Y,X,Edge)),Edges).

edgesList([],[]).
edgesList([node(X)|InL],[(node(X),Edges)|T]):-
   edges(X,Edges),
   edgesList(InL,T).

【讨论】:

  • 所以在这种情况下我根本不能使用成员?为什么我不能将成员与带有两个空列表的基本案例结合起来?
  • 我不认为问题出在一般使用成员,但如果你使用成员和基本情况这两个空列表,那么认为它会正常工作,当涉及基本情况时您通过 OutL 列表并要求为空,这是不可能的,因此这是行不通的。
  • 好吧,仍然不明白“何时使用成员,何时仅附加头部”退出,但您的回答很好,谢谢! :)
  • @CedricCornelis:几乎每次你需要建立一个列表(像这个例子)时,最简单和更清晰的方法是通过“模式匹配”来定义头部并递归地为尾部进行。使用成员没有错,但您需要明确基本情况,以便明确定义列表,我认为这要困难得多。例如,通过使用成员,解决方案将是:edgesList(InL,OutL):-edgesList(InL,OutL,0)。边缘列表([],L,N):-长度(L,N)。 edgesList([node(X)|InL],OutL,N):-member((node(X),Edges),OutL),edges(X,Edges), N1 为 N+1,edgesList(InL,OutL, N1),!.
猜你喜欢
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多