【问题标题】:Solving logic puzzle in Prolog [closed]在 Prolog 中解决逻辑难题 [关闭]
【发布时间】:2011-06-10 14:47:37
【问题描述】:

我正在阅读“立即学习 Prolog”,其中一个我自己无法解决的练习如下:

有一条街有三个 相邻的房子都有 不同的颜色。它们是红色的,蓝色的, 和绿色。不同的人 不同的民族生活在不同的地方 房子,他们都有不同的 宠物。这里有更多关于 他们:

  • 英国人住在红房子里。
  • 美洲虎是西班牙家庭的宠物。
  • 日本人住在蜗牛饲养员的右边。
  • 蜗牛饲养员住在蓝房子的左边。

斑马是谁养的?

定义一个谓词zebra/1,告诉您斑马主人的国籍。

提示:想想房屋和街道的表示。在 Prolog 中对四个约束进行编码。 membersublist 可能是有用的谓词。

任何想法如何在 Prolog 下对其进行编码?谢谢。

【问题讨论】:

    标签: prolog zebra-puzzle


    【解决方案1】:
    neigh(Left, Right, List) :- 
            List = [Left | [Right | _]];
            List = [_ | [Left | [Right]]].
    
    zebraowner(Houses, ZebraOwner):-
            member([englishman, _, red], Houses),
            member([spanish, jaguar, _], Houses),
            neigh([_, snail, _], [japanese, _, _], Houses),
            neigh([_, snail, _], [_, _, blue], Houses),
            member([ZebraOwner, zebra, _], Houses),
            member([_, _, green], Houses).
    
    
    zebra(X) :- zebraowner([_, _, _], X).
    

    【讨论】:

      【解决方案2】:

      我是Prolog的新手,但我认为neigh的定义不太正确。尝试:

         neigh(2,3,[1,2,3]).
      

      你侥幸逃脱,因为有两种解决方案,一种是日本拥有的斑马在第二宫,另一种是斑马在第三宫,你的代码只能找到一个(这足以回答题 :-)。 这段代码给出了 neigh 的正确答案,因此也给出了问题的两个答案:

      neigh(Left, Right, List) :- 
              List = [Left, Right ,_];
              List = [_, Left, Right]].
      

      但只适用于三个房子。更一般的实现是:

      neigh(Left, Right, List) :- 
              List = [Left , Right | _].
      neigh(Left, Right, [_|Tail]) :- 
              neigh(Left, Right, Tail).
      

      【讨论】:

      • 你是对的,在另一个答案的定义中存在错误/错字。你对三所房子的情况给出了一个有效的定义,但这就是我们这里的定义,所以没关系。另一个答案的定义也仅适用于三个房屋的情况。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2020-06-08
      相关资源
      最近更新 更多