guile - 在guile中,如何实现 tarai

我现在想运行 tarai,它按照如下方式读入 Prolog 。 一个测试用例是运行 ?- tarai(12,6,0,X) 。 这是一个相当难的测试用例,例如使用这个测试用例的GNU Prolog崩溃。


tarai(X, Y, Z, R) :- 


 X> Y -> 


 X1 is max(0,X-1), tarai(X1, Y, Z, Rx),


 Y1 is max(0,Y-1), tarai(Y1, Z, X, Ry),


 Z1 is max(0,Z-1), tarai(Z1, X, Y, Rz),


 tarai(Rx, Ry, Rz, R); 


 R = Y.



我最感兴趣的是测试用例是否可以在tarai的一些miniKanren代码的完全声明版本上运行。 另外,我可能会对向后运行一些测试案例感兴趣。

我有点不知所措了。 我成功安装了guile方案,它可以成功地运行 miniKanren测试用例。 但miniKanren没有整数,那么可以做些什么呢?

时间:

问题被拒绝询问如何在prolog规范中实现更通用的tarai函数版本,该规范允许x,y,z字段中的变量。 这里的技术可以用例如prolog实现。 kanren需要clpfd有限域求解器和类似的东西(上面的评论讨论,例如对number.scm的引用)。 使用这个我们可以将tarai定义为下面的代码(如果max和min也被定义为约束,这可以简化,但是在这里我们通过不等式实现这些并且反过来的情况)。


(define (taray x y z w)


 (lambda () 


 (conde ((<o x y) 


 (fresh (rx ry rz)


 (conde


 ((conde


 ((>o x 0) (fresh (xx) (iso xx (-o x 1)) (tarai xx y z rx))


 ((== x 0) (tarai 0 y z rx))


 ((>o y 0) (fresh (yy) (iso yy (-o y 1)) (tarai yy z x ry))


 ((== y 0) (tarai 0 z x ry))


 ((>o z 0) (fresh (zz) (iso zz (-o z 1)) (tarai zz x y rz))


 ((== z 0) (tarai 0 x y rz)))


 (tarai rx ry rz r)))))


 ((>=o x y) (== x y))))))



这里是一个逻辑编程环境,其中包含minikanren构造和prolog构造的逻辑编程环境,并且可以混合它们。 它还移植了clpfd库,因此你可以在这里执行以下的( unfourtunately atm不工作( 我正在使用的Bug ) ) 。 假定clpfd已经导入。 (,,;;像操作一样交错kanren)。 将代码替换为,;使用clpfd库可以运行的代码可以在上面运行。


tarai(X,Y,Z,W) :-


 (


 X #> Y, 


 (


 (


 (X #> 0, XX #= X - 1, tarai(XX,Y,Z,RX)) ;;


 (X = 0, tarai(0,Y,Z,RX)) ;;


 (Y #> 0, YY #= Y - 1, tarai(YY,Z,X,RY)) ;;


 (Y = 0, tarai(0,Z,X,RY)) ;;


 (Z #> 0, ZZ #= Z - 1, tarai(ZZ,X,Y,RZ)) ;;


 (Z = 0, tarai(0,X,Y,RZ))


 ),, 


 tarai(RX,TY,RZ,R)


 )


 ) ;;


 (X #= <Y, R=Y).



...