布尔SKI逻辑

问题描述 投票:1回答:1

我正在尝试grok组合器,所以我写了基本的组合器:Typescript中的KS

const K: Kestrel = a => b => a;
const S: Starling = a => b => c => a(c)(b(c));

然后,我关注了有关SKI Boolean Logic的Wikipedia文章:

TRUE = K
FALSE = SK

因此:

const TRUE: True = K;
const FALSE = S(K);

这已通过基本测试:

const t = () => true;
const f = () => false;

test('Ktf = (TRUE)tf = t', () => {
  const actual = TRUE(t)(f)();
  expect(actual).toBe(K(t)(f)());
  expect(actual).toBe(true);
});

test('SKxy = y', () => {
  expect(S(K)(t)(f)()).toBe(false);
  expect(FALSE(t)(f)()).toBe(false);
});

到目前为止很好,但是涉及到NOT维基百科说:

NOT = (FALSE)(TRUE) = (SK)(K)
(TRUE)NOT = TRUE(FALSE)(TRUE) = FALSE
(FALSE)NOT = FALSE(FALSE)(TRUE) = TRUE

我写了代码和测试,然后得到了:

const NOT = S(K)(K);

test('(TRUE)NOT = FALSE', () => {
  expect(TRUE(NOT)(t)(f)()).toBe(false); // <- see these () after (t)(f)?
  expect(TRUE(NOT)(f)(t)()).toBe(true);
});

test('(FALSE)NOT = TRUE', () => {
  expect(FALSE(NOT)(t)(f)).toBe(true); // <- here we don't have these ()
  expect(FALSE(NOT)(f)(t)).toBe(false);
});

我的问题是我用注释突出显示的两行内容:为什么要使测试通过,我需要TRUEFALSE之间的这种不对称性?似乎我遵循了KS实现中的所有详细信息,但是在TRUE(NOT)(t)(f)的情况下,我得到了函数() => false,在FALSE(NOT)(t)(f)的情况下,我得到了false

我是否错过了任何细节,或者维基百科的定义不够精确?

P.S .:这是代码:https://repl.it/repls/FuchsiaFuchsiaTruetype

boolean-logic combinators
1个回答
1
投票

两件事,1.您对NOT的实现是错误的,并且2.不对称纯粹是巧合。

1。巧合:

请注意,TRUEFALSE都是咖喱函数,正在等待另外两个args求值。

现在检查这个事实:

FALSE(NOT)(t) === t

FALSE实际上并不关心第一个参数,它所做的只是简单地返回第二个参数。因此,您获得t作为返回值,并且当您执行FALSE(NOT)(t)(f)时,实际上是在调用t(f),其中f是无用的arg,并产生true。因此是巧合。

2。 NOT的实现

Wikipedia页面将NOT写为后缀运算符,但这只是他们用来记下想法的文字表达。在JS代码中,您不能编写相同的代码。

((T)NOT = T(F)(T)= F

请参见NOT被扩展为两个args,以传递给它之前的函数。要在JS中实现这个想法,您需要编写:

const NOT = b => b(S(K))(K);

并将呼叫签名反转回正常形式:NOT(TRUE)

我在这里修改了您的原始代码:https://repl.it/@hackape/KnowledgeableWealthyDowngrade

© www.soinside.com 2019 - 2024. All rights reserved.