【问题标题】:Prolog - Creating predicatesProlog - 创建谓词
【发布时间】:2014-03-24 04:15:35
【问题描述】:

我试图在 Prolog 中创建的谓词(通过命令行通过断言等)在理论上相当简单。第一个是 second(X, List),它检查 X 是否是指定列表的第二个元素。另一个被称为两次([list],X),其中将列表放在左侧参数中会打印该列表,如下所示: [a,b,c] 变成 [a,a,b,b,c,c]

此外,使用相同的谓词但在右边而不是左边有一个参数应该会产生如下结果: [a,a,b,b] 变成 [a,b]

我真的不知道该怎么做。我知道列表表示为 [head|tail] 但我仍然感到困惑。我该如何制作这些谓词?

【问题讨论】:

  • 从阅读教程开始,或者从最近的图书馆借一本 Prolog 教科书。然后,尝试一些东西,如果这不起作用,请展示你所拥有的并解释它为什么不起作用。

标签: prolog predicate


【解决方案1】:

两者的提示:“尾巴”是一个列表,因此您可以将一个列表分解为 [Head | [Second|Tail] ]

你可以使用这个事实将谓词second(X, List)写在一行中。

twice(List, X) 谓词提示:使用递归!

  • 基本情况:当“X”是单元素列表时,“列表”应该是什么?
  • 递归案例:将列表分解为 Head、Second 和 Tail1。分手X 进入它的头部和尾部2。之间需要什么关系 这些价值观?确保在此递归调用两次。

要查看关系,请注意 twice([a,a,b,b], [a,b]) 的计算结果应为 true。

在这种情况下, List = [a,a,b,b]Head = aSecond = aTail1 = [b, b]

另外,X = [a,b] 所以Head = aTail2 = [b]。 所以我们只需要检查两个head和second是否相等,并且twice(Tail1, Tail2)是真的。

【讨论】:

  • 为什么不简单地使用[Head, Second|Tail] 而不是[Head | [Second|Tail] ]
  • 实际上我设法让它工作。我做了类似 second(X, [H,X|T]) 的事情,它奏效了。两次,结果类似于两次([A|B],[A,A|C]):-两次(B,C),但无论哪种情况,我都让它们都工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多