【问题标题】:applying a list to an entered function to check for tautology将列表应用于输入的函数以检查重言式
【发布时间】:2023-03-26 15:01:01
【问题描述】:

我想在 haskell 中编写一个函数来确定布尔函数(在 ghci 中使用 lambda 表达式输入)是否是重言式。 输入应如下所示:

taut n (\[x..] -> ... == ...)

taut 3 (\[x,y,z] -> ((x||y)||z) == (x||(y||z)) )

我已经用

创建了所有可能的布尔组合
combinations n = replicateM n [True,False] 

cmb n = concat (combinations n)

但现在我需要一个函数来获取列表中的这些元素并将它们插入到 then 输入函数中的 n 个变量中。

提前致谢:)

【问题讨论】:

  • 这不是真正的家庭作业,它是大学模块的额外作业......如果我们愿意,我们可以这样做,但这不是必需的 - 但我想这样做,因为我想至少以某种方式了解haskell ...

标签: haskell lambda


【解决方案1】:

您的combinations 函数已经生成了一个长度为n 的列表列表,其中包含TrueFalse 的所有可能排列。你确实不需要需要使用concat;结果已经包含所有可能的函数条目。之所以出现这种情况,是因为您正在检查的函数已经需要一个列表(它的形式为 \[a,b,c...])。

也就是说,对于获取长度为 3 的列表的 fncombinations 3 将是:

[[True,True,True],[True,True,False],[True,False,True],[True,False,False],
 [False,True,True],[False,True,False],[False,False,True],[False,False,False]]

这个列表的每个元素都是一个列表;您可以将它们直接传递给您正在检查的函数(可能是重言式)。鉴于上面的列表,您所要做的就是尝试每个元素。

编辑(试图澄清一点):

您需要一个函数taut,它采用[Bool] -> Bool 类型的另一个 函数并确定该函数是否是重言式。这意味着taut 将具有类似Int -> ([Bool] -> Bool) -> Bool 的类型。假设你是这样开始的:

taut :: Int -> ([Bool] -> Bool) -> Bool
taut n fn = ...

现在,n 是长度,fn 是函数。您的combinations 函数采用n 并将所有可能的有效输入 返回到fn。请注意fn 需要[Bool],而combinations n[[Bool]],这意味着每个元素都可以作为fn 的输入。知道了这一点,您需要做的就是将fn 应用于combinations n 的每个元素,看看结果是否始终相同。

在您的taut 函数中,您不必担心正在测试的函数中的变量是如何分配的。当您实际编写该函数时,如果它采用 \[x,y,z]->...xyz 的形式,将通过模式匹配在其中分配。

【讨论】:

  • 是的,我已经想知道我是否真的需要将它们放入一个列表中,但我想也许我可以使用这个列表并以某种方式“计数”并将布尔值插入变量中。 ..但这确实是问题开始的地方——我想我可能会开始测试如何将 lambda 函数输入到代码中,所以我输入了 taut [x,y,z] = (\[x,y,z] -> ((x||y)||z) == (x||(y||z)) ) 以查看是否可以为 x,y,z 插入布尔值,但是即使这给了我一个“没有实例......来自使用'print'”的错误,我真的不明白......
  • 我对您期望 taut 函数如何工作感到有些困惑。我以为您希望它采用 lambda 并尝试每种输入组合。您是否正在考虑以其他方式进行操作?此外,您评论中的taut 似乎与您问题中的taut 完全不同——第一个接受一个数字和一个函数;第二个似乎需要两个列表(Int -> [Bool] -> Bool vs [Bool] -> [Bool] -> Bool)。
  • 第二句话正是我希望它工作的方式......上面评论中的“taut”函数只是一个测试,我可以在其中看到如何插入值以更接近一个解决方案 - 但显然它无论如何都不起作用,我怀疑 Haskell 也能像这样工作。
  • 对。我将尝试澄清我的答案。
  • 哦,关于您的“无实例...”错误:您可能通过输入一个函数值得到它。这只是意味着 ghci 不知道如何打印你给它的值,也不知道如何将函数转换为字符串。
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多