原始递归如果那么其他实际执行If Else Then

eva*_*nal 1 recursion haskell computation-theory

我对If Then Else的定义中的投影有问题.它实际上是作为If-Else-Then执行的.

 import Prelude hiding (pred,and,or,not)

 data PR = Z
     | S
     | P Int
     | C PR [PR]
     | PR PR PR
     deriving Show
 eval :: PR -> [Integer] - Integer
 eval Z _ = 0
 eval S [x] = x+1
 eval (P n) xs = nth n xs
 eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
 eval (PR g h) (0:xs) = eval g xs
 eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)

 nth _ [] = error "nth nil"
 nth 0 _ = error "nth index"
 nth 1 (x:_) = x
 nth (n) (_:xs) = nth (n-1) xs

 one = C S [Z]
 plus = PR (P 1) (C S [P 2])
 ife = PR (P 1) (C (P 2) [P 3, P 4])
Run Code Online (Sandbox Code Playgroud)

如果我试图交换P 3P 4它只是完全打破(返回每次"然后"值).ite[0,2,3]应该返回3ite[1,2,3]应该返回2.相反,正好相反.我怎么能纠正这个?

小智 5

你觉得这堂课怎么样?我注意到你和我有非常相似的家庭作业,非常相似.

首先,你想要制作一个模仿IF-Then-Else模型的Primitive递归函数.因此,

eval ite [0,1,2] => 1
Run Code Online (Sandbox Code Playgroud)

eval ite [1,2,3] => 3
Run Code Online (Sandbox Code Playgroud)

并且根据您提供的内容,您似乎在相反的情况下获得具有相同质量的功能,具体取决于第一个输入.

ife = PR (P 1) (C (P 2) [P 3, P 4])

现在你的功能在说什么?您的ITE实现使用原始递归构造,这是一个开始,因为在此您可以根据条件将执行拆分为两个不同的表达式.布尔代数中使用的条件相同.如果0我们有假,否则如果一个数字评估为任何(0 <),我们就是真的.如果"堆栈"的头部为0,则PR构造通过评估其第一个参数来执行此操作,否则它会评估其第二个参数,希望沿着它的某个位置终止它(通常会将头部作为计数器并最终减少时间)执行第一个参数).但是对于所有意图和目的,我们可以说第二个表达式将在(0 <)上执行.

唷!那么,我们如何修复您的实施!?简单:

ife = PR (P 2) (C (P 1) [P 3, P 4])

我们切换你的两个投影,因为你只是向后.如果堆栈的头部是Z,我们想要投影第二个表达式,否则我们预测第一个表达式.或者更好的是:

ite = PR (P 2) (P 1)
Run Code Online (Sandbox Code Playgroud)

我想,我也没有完成家庭作业,如果我错了,我会非常感谢任何额外的见解.