【问题标题】:Prolog - How would I recursively build a list?Prolog - 我将如何递归地建立一个列表?
【发布时间】:2021-05-29 03:23:02
【问题描述】:

我正在完成Learn Prolog Now! 上的练习,最后一个问题让我很困惑。鉴于以下事实:

   byCar(auckland,hamilton).
   byCar(hamilton,raglan).
   byCar(valmont,saarbruecken).
   byCar(valmont,metz).
   byTrain(metz,frankfurt).
   byTrain(saarbruecken,frankfurt).
   byTrain(metz,paris).
   byTrain(saarbruecken,paris).
   
   byPlane(frankfurt,bangkok).
   byPlane(frankfurt,singapore).
   byPlane(paris,losAngeles).
   byPlane(bangkok,auckland).
   byPlane(singapore,auckland).
   byPlane(losAngeles,auckland).

写一个谓词 travel/2 来确定是否可以通过将汽车、火车、 和飞机旅行。例如,您的程序应该对 查询旅行(valmont,raglan)。

所以,通过 travel/2 查询上面的数据库,可以发现 从 Valmont 到 Raglan 是可能的。如果您正在计划 这样的航程,这已经是有用的知识了,但你会 可能更喜欢从 Valmont 到 Raglan 的精确路线。 写一个谓词 travel/3 告诉你什么时候走哪条路线 从一个地方到另一个地方旅行。例如,程序应该 响应 X = go(valmont,metz, 去(梅斯,巴黎, go(paris,losAngeles))) 到查询 travel(valmont,losAngeles,X) 。

这是我的 go 函子:

go(X).
go(X,Y).

这是我的旅行/2 谓词:

travel(X,Y) :- byCar(X,Y).
travel(X,Y) :- byCar(X,Z), travel(Z,Y).

travel(X,Y) :- byTrain(X,Y).
travel(X,Y) :- byTrain(X,Z), travel(Z,Y).

travel(X,Y) :- byPlane(X,Y).
travel(X,Y) :- byPlane(X,Z), travel(Z,Y).

但是,我的 travel/3 谓词有问题:

travel(X,Y,G) :- byCar(X,Y),   G = go(X, Y).
travel(X,Y,G) :- byCar(X,Z),   travel(Z,Y,G).

travel(X,Y,G) :- byTrain(X,Y), G = go(X, Y).       
travel(X,Y,G) :- byTrain(X,Z), travel(Z,Y,G).

travel(X,Y,G) :- byPlane(X,Y), G = go(X, Y).       
travel(X,Y,G) :- byPlane(X,Z), travel(Z,Y,G).

当我在问题中运行谓词时,我得到:

?- travel(valmont,losAngeles,X).
X = go(paris, losAngeles) .

但这并不是问题所需的完整列表。我不太确定如何做到这一点。我是否需要重写我的谓词。非常感谢您提供的任何帮助以帮助我了解我做错了什么!

【问题讨论】:

    标签: list prolog logic predicate


    【解决方案1】:

    您没有在 travel/3 谓词中适当地更改 G

    travel(X,Y, go(X, Y)) :- byCar(X,Y).
    travel(X,Y, go(X, Y)) :- byTrain(X,Y).
    travel(X,Y, go(X, Y)) :- byPlane(X,Y).
    
    travel(X,Y, go(X, Z, G)) :- byCar(X,Z), travel(Z,Y, G).
    travel(X,Y, go(X, Z, G)) :- byTrain(X,Z), travel(Z,Y, G).
    travel(X,Y, go(X, Z, G)) :- byPlane(X,Z), travel(Z,Y, G).
    

    你得到:

    | ?- travel(valmont, losAngeles, G).
    G = go(valmont,saarbruecken,go(saarbruecken,paris,go(paris,losAngeles))) ? ;
    G = go(valmont,metz,go(metz,paris,go(paris,losAngeles))) ? ;
    no
    

    作为奖励,您也可以嵌入旅行类型:

    travel_(X,Y, car(X, Y)) :- byCar(X,Y).
    travel_(X,Y, train(X, Y)) :- byTrain(X,Y).
    travel_(X,Y, plane(X, Y)) :- byPlane(X,Y).
          
    travel_(X,Y, car(X, Z, G)) :- byCar(X,Z), travel_(Z,Y, G).
    travel_(X,Y, train(X, Z, G)) :- byTrain(X,Z), travel_(Z,Y, G).
    travel_(X,Y, plane(X, Z, G)) :- byPlane(X,Z), travel_(Z,Y, G).
    

    现在你得到:

    | ?- travel_(valmont, losAngeles, G).
    G = car(valmont,saarbruecken,train(saarbruecken,paris,plane(paris,losAngeles))) ? ;
    G = car(valmont,metz,train(metz,paris,plane(paris,losAngeles))) ? ;
    no
    

    【讨论】:

    • 谢谢!现在可以使用了;你的回答帮助我理解了问题的下一部分——展示了(乘汽车、火车或平原)路线是如何走的。 “更改 G”涉及指定函子本身中的内容,以便它可以专门与基本案例统一!现在很有意义!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多