首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >prolog - tail递归问题

prolog - tail递归问题
EN

Stack Overflow用户
提问于 2014-03-18 07:57:01
回答 2查看 247关注 0票数 0

我是prolog的新手,我正在尝试创建一个谓词,但遇到了一些麻烦。

我有一个通过火车连接的城市列表。它们是通过我的links/2子句连接起来的。

代码语言:javascript
复制
links(toronto, ajax).
links(toronto, markham).
links(toronto, brampton).
links(brampton, markham).
links(markham, ajax).
links(brampton, mississauga).
links(mississauga, toronto).
links(mississuaga, oakville).
links(oakville, st.catharines).
links(oakville, hamilton).
links(hamilton, st.catharines).

我正在编写一个名为addnewcities的谓词,它将获取一个城市列表,然后返回一个包含原始列表的新列表,以及与原始列表中的每个城市直接相关的所有城市。

这是链接的(粗略的)视觉表示。

如果我的输入列表是[toronto],我希望我的输出是(顺序无关紧要) [ajax,markham,brampton,mississauga,toronto]

如果输入为[oakville,hamilton],我希望输出为[mississauga,st.catharines,oakville,hamilton]

到目前为止,这是我的谓词。

代码语言:javascript
复制
addnewcities([],_).
addnewcities([CitiesH|Tail],Ans):- directer(CitiesH,Ans2),  merger(Ans2,[CitiesH],Ans), addnewcities(Tail,Ans).

directer/2获取一个城市,并在第二个参数中保存一个包含所有直接连接的城市的列表。

merger/3只是合并两个列表,以确保在最终的列表中没有重复。

当我的输入是一个只有一个元素的列表,也就是[toronto],它就能工作!但是当我有一个包含多个元素的[toronto,ajax]列表时,它每次都会显示"false“。

我很确定我的问题是,当它第二次递归时,merge就是它的false。我只是不知道如何解决这个问题,这样我的列表才能不断更新,而不是被检查是否是真的。

如有任何帮助,我们不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2014-03-18 15:53:49

此查询使用库支持来解决此问题:

代码语言:javascript
复制
addcities(Cs, L) :-
  setof(D, C^(member(C,Cs), (C=D;link(C,D);link(D,C))), L).
票数 1
EN

Stack Overflow用户

发布于 2014-03-18 17:26:08

这应该可以满足您的需求:

代码语言:javascript
复制
addcities(A,B):-
    addcitiesaux(A,[],B).

addcitiesaux([],X,X).

addcitiesaux([X|Xs],L,R):-
    link(X,A),
    \+ member(A,L),
    !,
    addcitiesaux([X|Xs],[A|L],R).

addcitiesaux([X|Xs],L,R):-
    link(A,X),
    \+ member(A,L),
    !,
    addcitiesaux([X|Xs],[A|L],R).

 addcitiesaux([X|Xs],L,R):-
    addcitiesaux(Xs,[X|L],R).
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22467824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档