cosmopolitan/tool/plinko/lib/isycombinator.c
2022-04-07 20:30:22 -07:00

172 lines
6.9 KiB
C

/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│
╞══════════════════════════════════════════════════════════════════════════════╡
│ Copyright 2022 Justine Alexandra Roberts Tunney │
│ │
│ Permission to use, copy, modify, and/or distribute this software for │
│ any purpose with or without fee is hereby granted, provided that the │
│ above copyright notice and this permission notice appear in all copies. │
│ │
│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │
│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │
│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │
│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │
│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │
│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │
│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │
│ PERFORMANCE OF THIS SOFTWARE. │
╚─────────────────────────────────────────────────────────────────────────────*/
#include "tool/plinko/lib/plinko.h"
/**
* Matches
*
* (⅄ (λ (N) ((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M)))))) . Q)
*
* @return true if matches, otherwise false
* @note M must be a non-nil atom
* @note N must be a non-nil atom
* @note Q is ignored
* @note V must be a non-nil atom
* @note W must be a non-nil atom
* @note λ means LAMBDA
* @note ⅄ means CLOSURE
*/
bool IsYcombinator(int x_) {
dword w_;
if (x_ >= 0) return false;
w_ = Get(x_);
int ax_ = LO(w_);
int dx_ = HI(w_);
if (ax_ != kClosure) return false;
if (dx_ >= 0) return false;
w_ = Get(dx_); // ((λ (N) ((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M)))))) . Q)
int adx_ = LO(w_);
int ddx_ = HI(w_);
if (adx_ >= 0) return false;
w_ = Get(adx_); // (λ (N) ((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M))))))
int aadx_ = LO(w_);
int dadx_ = HI(w_);
if (aadx_ != kLambda) return false;
if (dadx_ >= 0) return false;
w_ = Get(dadx_); // ((N) ((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M))))))
int adadx_ = LO(w_);
int ddadx_ = HI(w_);
if (adadx_ >= 0) return false;
w_ = Get(adadx_); // (N)
int aadadx_ = LO(w_);
int dadadx_ = HI(w_);
if (ddadx_ >= 0) return false;
w_ = Get(ddadx_); // (((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M))))))
int addadx_ = LO(w_);
int dddadx_ = HI(w_);
int N = aadadx_;
if (N <= 0) return false;
if (addadx_ >= 0) return false;
w_ = Get(addadx_); // ((λ (W) (W W)) (λ (V) (N (λ M ((V V) . M)))))
int aaddadx_ = LO(w_);
int daddadx_ = HI(w_);
if (dadadx_) return false;
if (dddadx_) return false;
if (aaddadx_ >= 0) return false;
w_ = Get(aaddadx_); // (λ (W) (W W))
int aaaddadx_ = LO(w_);
int daaddadx_ = HI(w_);
if (daddadx_ >= 0) return false;
w_ = Get(daddadx_); // ((λ (V) (N (λ M ((V V) . M)))))
int adaddadx_ = LO(w_);
int ddaddadx_ = HI(w_);
if (aaaddadx_ != kLambda) return false;
if (adaddadx_ >= 0) return false;
w_ = Get(adaddadx_); // (λ (V) (N (λ M ((V V) . M))))
int aadaddadx_ = LO(w_);
int dadaddadx_ = HI(w_);
if (daaddadx_ >= 0) return false;
w_ = Get(daaddadx_); // ((W) (W W))
int adaaddadx_ = LO(w_);
int ddaaddadx_ = HI(w_);
if (ddaddadx_) return false;
if (adaaddadx_ >= 0) return false;
w_ = Get(adaaddadx_); // (W)
int aadaaddadx_ = LO(w_);
int dadaaddadx_ = HI(w_);
if (aadaddadx_ != kLambda) return false;
if (ddaaddadx_ >= 0) return false;
w_ = Get(ddaaddadx_); // ((W W))
int addaaddadx_ = LO(w_);
int dddaaddadx_ = HI(w_);
if (dadaddadx_ >= 0) return false;
w_ = Get(dadaddadx_); // ((V) (N (λ M ((V V) . M))))
int adadaddadx_ = LO(w_);
int ddadaddadx_ = HI(w_);
int W = aadaaddadx_;
if (W <= 0) return false;
if (adadaddadx_ >= 0) return false;
w_ = Get(adadaddadx_); // (V)
int aadadaddadx_ = LO(w_);
int dadadaddadx_ = HI(w_);
if (addaaddadx_ >= 0) return false;
w_ = Get(addaaddadx_); // (W W)
int aaddaaddadx_ = LO(w_);
int daddaaddadx_ = HI(w_);
if (ddadaddadx_ >= 0) return false;
w_ = Get(ddadaddadx_); // ((N (λ M ((V V) . M))))
int addadaddadx_ = LO(w_);
int dddadaddadx_ = HI(w_);
if (dadaaddadx_) return false;
int V = aadadaddadx_;
if (V <= 0) return false;
if (dddaaddadx_) return false;
if (addadaddadx_ >= 0) return false;
w_ = Get(addadaddadx_); // (N (λ M ((V V) . M)))
int aaddadaddadx_ = LO(w_);
int daddadaddadx_ = HI(w_);
if (aaddaaddadx_ != W) return false;
if (dadadaddadx_) return false;
if (daddaaddadx_ >= 0) return false;
w_ = Get(daddaaddadx_); // (W)
int adaddaaddadx_ = LO(w_);
int ddaddaaddadx_ = HI(w_);
if (dddadaddadx_) return false;
if (adaddaaddadx_ != W) return false;
if (aaddadaddadx_ != N) return false;
if (ddaddaaddadx_) return false;
if (daddadaddadx_ >= 0) return false;
w_ = Get(daddadaddadx_); // ((λ M ((V V) . M)))
int adaddadaddadx_ = LO(w_);
int ddaddadaddadx_ = HI(w_);
if (adaddadaddadx_ >= 0) return false;
w_ = Get(adaddadaddadx_); // (λ M ((V V) . M))
int aadaddadaddadx_ = LO(w_);
int dadaddadaddadx_ = HI(w_);
if (ddaddadaddadx_) return false;
if (aadaddadaddadx_ != kLambda) return false;
if (dadaddadaddadx_ >= 0) return false;
w_ = Get(dadaddadaddadx_); // (M ((V V) . M))
int adadaddadaddadx_ = LO(w_);
int ddadaddadaddadx_ = HI(w_);
int M = adadaddadaddadx_;
if (M <= 0) return false;
if (ddadaddadaddadx_ >= 0) return false;
w_ = Get(ddadaddadaddadx_); // (((V V) . M))
int addadaddadaddadx_ = LO(w_);
int dddadaddadaddadx_ = HI(w_);
if (addadaddadaddadx_ >= 0) return false;
w_ = Get(addadaddadaddadx_); // ((V V) . M)
int aaddadaddadaddadx_ = LO(w_);
int daddadaddadaddadx_ = HI(w_);
if (dddadaddadaddadx_) return false;
if (aaddadaddadaddadx_ >= 0) return false;
w_ = Get(aaddadaddadaddadx_); // (V V)
int aaaddadaddadaddadx_ = LO(w_);
int daaddadaddadaddadx_ = HI(w_);
if (daddadaddadaddadx_ != M) return false;
if (aaaddadaddadaddadx_ != V) return false;
if (daaddadaddadaddadx_ >= 0) return false;
w_ = Get(daaddadaddadaddadx_); // (V)
int adaaddadaddadaddadx_ = LO(w_);
int ddaaddadaddadaddadx_ = HI(w_);
if (adaaddadaddadaddadx_ != V) return false;
if (ddaaddadaddadaddadx_) return false;
return true;
}