Data Scientist - Portland, OR
THE CHALLENGE
Every company has strategic priorities and urgency to achieve them, but very few have a cohesive, data driven approach to aligning, measuring and driving those strategic priorities at market speed. Yet, this is perhaps the most important business process to growth, and it's the least automated today.
At WorkBoard, we're creating an entirely new solution category with our Strategy & Results Platform to engage everyone from the CEO to the receptionist in understanding, aligning and achieving their organization's strategy faster. We're solving a real pain for customers, and our business is tripling every year! As a Data Scientist you will literally have your pulse on the data that partly makes WorkBoard so successful. You will have to think deeply, carefully and strategically. Remain agile, open and focused on execution. You will be an integral element in our continued growth and part of a team that shares in its success as a whole.
THE OPPORTUNITY
As a foundational member of our Data Science team, you'll work closely with our Director of Engineering, AI and Data Science to develop, extend and refine our data processes, insights and visualizations. You'll provide ideas, proof of concepts, develop and deploy production models/solutions along with guidance on infrastructure support and scale.
THE TEAM
You'll join a team where everyone—including you—is striving to constantly improve the quality of experience we provide our customers by delivering at our best and being voracious learners. We are an incredibly supportive team and close to our customers. When problems arise, everyone in the engineering team pitches in. We are excited about a lot of things—what "best" looks like for our customers, what "breakthrough" looks like in engineering—and we share these passions across the company and with our customers. Customers even attend our hackathons, affectionately named WoBoCon.
COMING IN
Bring 2-4 years of experience in Data Science, an analyzer mindset, and a technical degree. You'll be supporting our product, sales, leadership, and marketing teams with insights gained from analyzing company data. You'll be adept at using large data sets to find opportunities for product and process optimization and using models to test the effectiveness of different courses of action. You will have experience using a variety of data mining/data analysis methods, using a variety of data tools, languages and frameworks, building and implementing ML models, using/creating algorithms, and creating/running simulations. You will have a proven ability to drive business results with data-based insights and you must be comfortable working with a wide range of stakeholders and functional teams. You must have a passion for discovering solutions in large data sets and working with stakeholders to improve business and product outcomes.
YOUR SKILLSET
Problem solving skills with an emphasis on product development.
Experience using statistical computer languages (R, Python) to manipulate data and draw insights from large data sets.
Experience working with and creating data architectures.
Experience with a variety of machine learning techniques (clustering, decision tree learning, artificial neural networks, etc.) and their real-world advantages/drawbacks.
Some knowledge of advanced statistical techniques and concepts (regression, properties of distributions, statistical tests and proper usage, etc.).
Proficient and demonstrable experience with databases such as MySQL, MongoDB, etc.
Knowledge with cloud based services: AWS, Azure, GCP, etc.
Excellent written and verbal communication skills for coordinating across teams.
A drive to learn and master new technologies and techniques.
WITHIN ONE MONTH, YOU'LL:
Complete WorkBoard's new-hire training week, and learn what it means to build an elegant Strategy & Results platform.
Ramp up on WorkBoard's architecture, engineering stack and attend engineering sessions designed and presented by peers.
Own, plan and implement your first data science project along with your manager.
Work with you manager to define your next periods objectives.
WITHIN THREE MONTHS, YOU'LL:
Have a deep understanding of the services that WorkBoard is comprised of and how they interact with one another.
Have a complete understanding of the data available, how to access and work within.
Seek, explore and implement data solutions as well as present them to the team.
Assist in architecting WorkBoard's data science strategy and goals.
Assist in developing ML/DS solutions both for internal and external use cases.
Assess the effectiveness and accuracy of new data sources and data gathering techniques.
Mine and analyze data from company databases to drive optimization and improvement of product development, marketing techniques and business strategies.
WITHIN SIX MONTHS, YOU'LL:
Confidently manage WorkBoard's Data Science Strategy.
Contributing suggestions to our roadmap for improvements.
Lead in developing ML/DS solutions both for internal and external use cases.
Continue to optimize for increasing scale and a larger global customer base.
Use predictive modeling to increase and optimize customer experiences, revenue generation, ad targeting and other business outcomes.
WITHIN TWELVE MONTHS, YOU'LL:
Maintain knowledge of WorkBoard's data, systems, operational best practices and teach them to new members of the team.
Learn advanced skills in ML/DS algorithms, modeling, developing and deploying.
Develop processes and tools to monitor and analyze model performance and data accuracy.
Contribute to effort to add multiple points of presence to improve WorkBoard's offerings globally.
THE WORKBOARD STORY
WorkBoard provides a powerful, modern results platform to help companies achieve their growth plans. Unlike most enterprise software, our solution is important to every employee, so we strive to set the high bar for capabilities that delight and enable everyone to be more successful at work. Large enterprises like Cisco, Reliance Industries, Samsung, Deutsche Telekom, GE, Transamerica, Cision, and fast-growth companies like Go1, Influitive, Malwarebytes and many others use WorkBoard to fuel faster growth.
We are proud to be an equal opportunity workplace committed to building a team culture that celebrates learning, diversity and inclusion. If you're hungry to grow your skills while growing a company, your sense of urgency matches the size of our market opportunity, and you value and enable team mates' contributions, then come join us!
This position is based in Portland, OR.
Salary is competitive and commensurate with experience.


Set up Docker Hub notifications in Slack
Estimated reading time: 1 minuteDocker Hub can integrate with your Slack team to provide notifications about builds.
Set up a Slack integration
Before you begin, make sure that you are signed into the Slack team that you want to show notifications in.
-
Log in to the Docker account that owns the builds that you want to receive notifications about.
Note: If you are setting up notifications for an organization, log in as a member of the organization’s
Owners
team, then switch to the organization account to change the settings. -
Click Account Settings in the left hand navigation, and scroll down to the Notifications section.
-
Click the plug icon next to Slack.
The Docker Hub page refreshes to show a Slack authorization screen.
- On the page that appears, double check that you’re signed in to the correct Slack team. (If necessary sign in to the correct one.)
- Select the channel that should receive notifications.
-
Click Authorize.
Once you click Authorize, you should see a message in the Slack channel notifying you of the new integration.
Once configured, choose a notification level:
- Off Do not receive any notifications.
- Only failures Only receive notifications about failed builds.
- Everything Receive notifications for both failed and successful builds.
Enjoy your new Slack channel integration!
Edit a Slack integration
-
Click Account Settings in the lower left, scroll down to Notifications, and locate the Slack section. From here you can choose a new notification level, or remove the integration.
-
From the Slack Notifications section you can also change the channel that the integration posts to. Click the reload icon (two arrows) next to the Slack integration to reopen the OAuth channel selector.
-
Alternately, go to the Slack App Management page and search for “Docker Hub”. Click the result to see all of the Docker Hub notification channels set for the Slack team.


{% filter textile %}
h2. Distribution
Information related to the distributions installed on the systems
that popcorn submissions are received from.
h3(#show-a-distribution). Show a distribution
Information about a distribution, including all the submissions
received for that distribution.
@GET /distro//@
h4. Arguments
distro_name
Canonical distribution name (e.g. "openSUSE", "SUSE Linux
Enterprise Server")


It's quite easy to get thin bars in your Bar chart by using the
marginInner
property. This property doesn't
directly specify the width of the bar, but specifies the amount
of space each side of the bar. If you set it to 0 to
start with and gradually increase it you can more easily see the
effect that it has.
This also applies to the Horizontal Bar chart and the
vmargin
property.
Warning: If you set this property too high it can make the width of the bars negative. The Bars may appear to be OK but dynamic features such as tooltips will cease to work.
  Put this where you want the chart to show up:

 <canvas id="cvs" width="600" height="250">[No canvas support]</canvas>

 <input type="text" id="marginInner" value="5" /> <button onclick="bar.set('marginInner', Number(document.getElementById('marginInner').value)); RGraph.clear(bar.canvas); bar.draw();">Set marginInner</button>

This is the code that generates the chart - it should be placed AFTER the canvas tag(s):


This page provides pointers to the materials (datasets, software, workflows, provenance traces and container image) used in a paper currently under review (more details about the publication will be announced at a later stage)
Summary: The primary goal of our study is to demonstrate an example computational paradigm that uses meta-workflows (i.e., workflows that assess the results of two or more workflows) alongside abstract components (i.e, components that can be implemented with multiple tools) to overcome barriers facing multi-omic discovery. We characterize the reproducibility of multi-omics discoveries by attempting a figure-for-figure reproduction of the seminal paper by Zhang et al [1]. We then assess the robustness of its findings by re-running all the experiments with newly acquired data, discussing the differences of the obtained results.
This page and the materials described on it (excluding external references) is available in Zenodo under DOI 10.5281/zenodo.4633542.
This HTML page itself is accessible under the following permanent identifier: https://w3id.org/dgarijo/ro/zhang_et_al_2014_reanalysis_and_reuse
Note that availability on some of the following datasets may be subject to the the platforms where they are stored:
[1] Zhang, B. et al. Proteogenomic characterization of human colon and rectal cancer. Nature 513, 382-387, doi:10.1038/nature13438 (2014)
Researcher
Bioinformaticist at the Mallik Lab of Stanford Univesity. She is interested in developing tools and pipelines for multi-omic analysis.
Researcher
Researcher at the Polytechnic University of Madrid and past researcher at the Information Sciences Institute of the University of Southern California. Daniel's research activities focus on e-Science and the Semantic web, specifically on how to increase the understandability of software and scientific workflows using provenance, metadata, intermediate results and Linked Data.
Research Programmer
Research programmer at the Information Sciences Institute of the University of Southern California. Ratnakar is the main developer of the WINGS workflow system.
Data Scientist
Research collaborator at the Mallick lab, Stanford. Arunima currently works as a Data Scientist at a major pharmaceutical company.
Researcher
Research collaborator at the Vanderbilt University, now working as a Bioinformatics and proteome informatics consultant.
Research Assistant Professor
Research Assistant Professor of Biomedical Informatics in the School of Medicine at Vanderbilt University. His research interests focus on integrating multi-dimensional omics data to understand cancer mechanism. His current work focuses on assessing biological relevance of mRNA and protein profiling data and developing computational tools to discover and interpret novel associations among cancer omics data.
Research Instructor
Research instructor of biomedical informatics in the School of Medicine at Vanderbilt University. Dr. Wang has extensive experience with biological data, including sequencing data analysis and gene expression. Her research focuses on using such resources in parallel with shotgun proteomics data, an emerging field termed proteogenomics, to understand cancer biology. Her current projects include developing bioinformatics methods for proteogenomics studies and its application to human cancer studies.
Professor
Professor at the South African Tuberculosis Bioinformatics Initiative. Dr Tabb and his team have created a complete software pipeline for proteome informatics, contributing to the field-standard ProteoWizard library for mass spectrometry informatics, creating three distinct peptide identification algorithms, and developing the highly scalable IDPicker protein assembly environment. Dr Tabb moved to Stellenbosch University in 2015 to speed the development of proteomics in South Africa and to add support to tuberculosis researchers throughout Cape Town.
Professor
Professor at the Lester and Sue Smith Breast Center of the Baylor College of Medicine (Houston, TX); and professor at the Department of Molecular and Human Genetics of the Baylor College of Medicine. Professor Zhang's research interests focus on developing computational and statistical approaches that help translating multidimensional omics data into biological and clinical insights.
Professor
TDAI Chief Data Scientist; Professor of Computer Science and Engineering at the College of Engineering and Biomedical Informatics, College of Medicine. Dr. Machiraju’s interests include visual analytics, modeling, and machine learning, especially as they apply to topics in biology, medicine, and engineering. Over the years he has been working increasingly on problems of computational biology and bioinformatics including the discovery of biomarkers and disease subtypes and the modeling and reconstruction of signal transduction networks.
Research Professor
Director of Knowledge Technologies and at the Information Sciences Institute of the University of Southern California, and Research Professor in the Computer Science Department. Her research interests include intelligent user interfaces, social knowledge collection, provenance and assessment of trust, and knowledge management in science. Dr Gil's most recent work focuses on intelligent workflow systems to support collaborative data analytics at scale.
Associate Professor in Radiology
Associate Professor in Radiology. Dr. Mallick is also member of the Stanford Cancer Institute and a faculty fellow of Stanford ChEM-H. After completing his PhD, he trained with Ruedi Aebersold in clinical proteomics and systems biology at the Institute for Systems Biology.
Designed deived from w3.css


TwitchToolkit is a mod written by Twitch.tv/hodlhodl that integrates storytelling decisions into chat votes, awards viewers coins for watching, and those coins can be spent on items/events in game.
I am currently using Nesi's Rimvali mod, along with Reich Armory and Soviet Armory. Below you can find the list of purchaseable in game items. Click on the header of a row to sort by that variable (Note: Price sorting doesn't work at the moment.) When purchased, they will be sent to the colony using a drop pod, and I will have full control of the item from there.
Use !bal to check your coin balance!
Find the "itemname" of the item you want, and type in the Twitch chat: "!buy (itemname) (ammount)"
ex: "!buy kidney 100" would send 100 kidneys to me. Minimum purchase worth 10 coins.
Click on "Events" in the top bar to see the list of purchaseable events!
| itemname | price | category | item description |
|---|---|---|---|
| 15cmherocket | 167 | Security | Rocket for 15cm Nebelwerfer rocket launcher |
| 15cmnebelwerfer41 | 1567 | Security | 15cm Nebelwerfer artillery rocket launcher, German WW2 era |
| 2cmflak38camouflagepaint | 1300 | Security | 2cm Flak 38 Anti-Air gun, German WW2 era |
| 2cmhefi-tbelt | 167 | Security | Ammo for 2cm Flak 38 Anti-Air gun |
| 3,7cmapcrshell | 167 | Security | APCR round for Pak 36 Anti-Tank gun |
| 3,7cmheshell | 167 | Security | HE round for Pak 36 Anti-Tank gun |
| 3,7cmpak36 | 1467 | Security | 3.7cm PAK 36 Anti-Tank gun, German WW2 Era |
| 7,5cmapcrshell | 167 | Security | APCR round for Pak 40 Anti-Tank gun |
| 7,5cmheshell | 167 | Security | HE round for Pak 40 Anti-Tank gun |
| 7,5cmpak40camouflagepaint | 3050 | Security | 7.5 cm Pak 40 Anti-Tank gun, German WW2 era |
| advancedbionicarm | 500 | Bionic | AvaliAdvancedBionicArm |
| advancedbionicavalileg | 1925 | Bionic | AvaliAdvancedBionicLeg |
| advancedbionicavalitail | 500 | Bionic | AvaliAdvancedBionicTail |
| advancedcomponent | 333 | Manufactured | ComponentSpacer |
| advancedtemperaturecontrolaugment[tca] | 83 | Bionic | Augment for Avali to properly survive in different temperatures |
| aero-tungstencarbide | 33 | Avali resources | AeroTungstenCarbide, an advanced, high quality Avali material |
| agavefruit | 2 | Vegetarian | RawAgave |
| alpaca | 583 | Animal | Alpaca |
| alpacameat | 3 | Meat | Meat_Alpaca |
| alpacawool | 4 | Textiles | WoolAlpaca |
| alphabeaver | 417 | Animal | Alphabeaver |
| alphabeavermeat | 3 | Meat | Meat_Alphabeaver |
| ambrosia | 25 | Drugs | A soft fruit. Ambrosia has a wonderful smell and taste, and produces a soft chemical high, which increases mood. However, it is slightly addictive if eaten too often. |
| animalbed | 136 | Furniture | AnimalBed |
| animalsleepingbox | 84 | Furniture | AnimalSleepingBox |
| antigrainwarhead | 2000 | Mortar shells | Nuclear Mortar Shell |
| archotecharm | 4667 | Archotech | Extremely advanced Bionic Arm |
| archotecheye | 4667 | Archotech | Extremely advanced Bionic Eye |
| archotechleg | 4667 | Archotech | Extremely advanced Bionic Leg |
| arcticfox | 333 | Animal | Fox_Arctic |
| arcticwolf | 583 | Animal | Wolf_Arctic |
| armchair | 450 | Furniture | Armchair |
| artbench | 425 | Production | TableSculpting |
| autophagicsystemrewriteaugment | 250 | Bionic | Does some weird science shit to make Avali bodies more productive |
| avali | 10000 | Animal | Spawn an Avali (no clue what this would do) |
| avalileather | 7 | Leathers | Avali skin. Why? |
| avalimeat | 3 | Meat | You sicko. |
| avalinano-printingforge | 1783 | Production | Allows for production of Avali materials/equipment |
| avalinano-printingloom | 1783 | Production | Allows for production of Avali materials/equipment |
| avalipistol | 295 | Ranged weapons | AvaliPistol |
| avaliresearchbench | 1383 | Production | Allows for research of Avali Tech |
| avalirifle | 1142 | Ranged weapons | AvaliRifle |
| avaliscythe | 212 | Melee weapons | AvaliScythe |
| avalishotgun | 883 | Ranged weapons | AvaliShotgun |
| avalismg | 2508 | Ranged weapons | AvaliSMG |
| avalisniperrifle | 2517 | Ranged weapons | AvaliSniperRifle |
| avalispear | 296 | Melee weapons | AvaliSpear |
| avalitail | 17 | Natural | RimValiTail |
| avaliturret | 492 | Security | AvaliBasicTurret |
| avaliviroblade | 667 | Melee weapons | Avali Sciency sword |
| basicbionicarm | 350 | Bionic | AvaliBasicBionicArm |
| basicbionicavalileg | 350 | Bionic | AvaliBasicBionicLeg |
| basicbionicavalitail | 350 | Bionic | AvaliBasicBionicTail |
| basictemperaturecontrolaugment[tca] | 83 | Bionic | AvaliBasicTempControl |
| battery | 333 | Power | Battery |
| bearmeat | 3 | Meat | Meat_Bear_Grizzly |
| bearskin | 6 | Leathers | Leather_Bear |
| bed | 155 | Furniture | Bed |
| bedroll | 137 | Furniture | Bedroll |
| beef | 3 | Meat | Meat_Cow |
| beer | 20 | Drugs | Beer can taste good, but its main effect is intoxication. Excessive consumption can lead to alcohol addiction. |
| berries | 2 | Vegetarian | RawBerries |
| billiardstable | 600 | Furniture | BilliardsTable |
| bionicarm | 1717 | Bionic | BionicArm |
| bionicear | 1308 | Bionic | BionicEar |
| bioniceye | 1717 | Bionic | BionicEye |
| bionicheart | 1717 | Bionic | BionicHeart |
| bionicspine | 1717 | Bionic | BionicSpine |
| bionicstomach | 1308 | Bionic | BionicStomach |
| bison | 583 | Animal | Bison |
| bisonmeat | 3 | Meat | Meat_Bison |
| bisonwool | 4 | Textiles | WoolBison |
| bluefur | 4 | Leathers | Leather_Bluefur |
| boomalope | 583 | Animal | Boomalope |
| boomalopemeat | 3 | Meat | Meat_Boomalope |
| boomrat | 167 | Animal | Boomrat |
| boomratmeat | 3 | Meat | Meat_Boomrat |
| bowlerhat | 77 | Headgear | Apparel_BowlerHat |
| brewery | 350 | Production | Brewery |
| butchertable | 302 | Production | TableButcher |
| button-downshirt | 166 | Apparel | Apparel_CollarShirt |
| camelhide | 4 | Leathers | Leather_Camel |
| capybara | 250 | Animal | Capybara |
| capybarameat | 3 | Meat | Meat_Capybara |
| caribou | 500 | Animal | Caribou |
| cariboumeat | 3 | Meat | Meat_Caribou |
| cassowary | 333 | Animal | Cassowary |
| cat | 167 | Animal | Cat |
| catmeat | 3 | Meat | Meat_Cat |
| chainshotgun | 675 | Ranged weapons | Gun_ChainShotgun |
| chargelance | 2258 | Ranged weapons | Gun_ChargeLance |
| chargerifle | 1683 | Ranged weapons | Gun_ChargeRifle |
| chemfuel | 4 | Manufactured | Chemfuel, fuel used for many things |
| chesstable | 281 | Furniture | ChessTable |
| chicken | 83 | Animal | Chicken |
| chickenmeat | 3 | Meat | Meat_Chicken |
| chinchilla | 250 | Animal | Chinchilla |
| chinchillafur | 11 | Leathers | Leather_Chinchilla |
| chinchillameat | 3 | Meat | Meat_Chinchilla |
| chocolate | 5 | Foods | Chocolate! |
| cloth | 2 | Textiles | Cloth |
| club | 141 | Melee weapons | MeleeWeapon_Club |
| cobra | 250 | Animal | Cobra |
| cobraegg(fert.) | 67 | Eggs (fert.) | Cobra Egg |
| cobrameat | 3 | Meat | Meat_Cobra |
| component | 53 | Manufactured | Components are extremely vital resources for construction |
| corn | 2 | Vegetarian | RawCorn |
| cougar | 667 | Animal | Cougar |
| cougarmeat | 3 | Meat | Meat_Cougar |
| cow | 500 | Animal | Cow |
| cowboyhat | 94 | Headgear | Apparel_CowboyHat |
| deepdrill | 483 | Production | Used for mining |
| deer | 417 | Animal | Deer |
| devilstrand | 9 | Textiles | DevilstrandCloth |
| diningchair | 198 | Furniture | DiningChair |
| dogleather | 3 | Leathers | Leather_Dog |
| donkey | 533 | Animal | Donkey |
| donkeymeat | 3 | Meat | Meat_Donkey |
| doomsdayrocketlauncher | 1667 | Ranged weapons | Extremely powerful, single use rocket launcher |
| doublebed | 292 | Furniture | DoubleBed |
| doublebedroll | 290 | Furniture | BedrollDouble |
| dresser | 179 | Furniture | Dresser |
| dromedary | 500 | Animal | Dromedary |
| dromedarymeat | 3 | Meat | Meat_Dromedary |
| druglab | 742 | Production | DrugLab |
| duck | 100 | Animal | Duck |
| duckegg(fert.) | 12 | Eggs (fert.) | EggDuckFertilized |
| duckmeat | 3 | Meat | Meat_Duck |
| duster | 327 | Apparel | Duster, a really fuckin sick looking jacket |
| eintossflammenwerfer46 | 342 | Weapon | Eintossflammenwerfer46 is a single use, cheap flamethrower. |
| electricsmelter | 667 | Production | ElectricSmelter |
| electricsmithy | 492 | Production | ElectricSmithy |
| electricstove | 375 | Production | ElectricStove |
| electrictailorbench | 533 | Production | ElectricTailoringBench |
| elephant | 1000 | Animal | Elephant |
| elephantleather | 5 | Leathers | Leather_Elephant |
| elephantmeat | 3 | Meat | Meat_Elephant |
| elephanttusk | 133 | Items | ElephantTusk |
| elitetemperaturecontrolaugment[tca] | 800 | Bionic | Implant provides advanced Temperature Control, allowing avali to withstand more temperatures |
| elk | 500 | Animal | Elk |
| elkmeat | 3 | Meat | Meat_Elk |
| empgrenades | 525 | Grenades | EMP Grenade |
| emplauncher | 842 | Ranged weapons | EMP Grenade Launcher |
| emu | 333 | Animal | God foresaken animal |
| endtable | 106 | Furniture | EndTable |
| fennecfox | 333 | Animal | Fox_Fennec |
| fermentingbarrel | 95 | Production | Used to produce alcohol and drugs |
| ferrogel | 3 | Avali resources | Aerogel is an orange, basic Avali material |
| ferroweave | 6 | Avali resources | Aeroweave is a slightly advanced Avali material |
| fg42 | 917 | Weapon | The FG42 is a fully automatic rifle, German WW2 era |
| finemeal | 33 | Meals | Good food for the colonists |
| firefoampopper | 300 | Misc | Firefoam dispenser, used to combat fires |
| firefoamshell | 92 | Mortar shells | Mortar Shell used to put out fires using firefoam |
| flakhelmet | 442 | Headgear | Flak Helmet |
| flakjacket | 483 | Armor | Flak Jacket |
| flakpants | 375 | Armor | Flak Pants |
| flakvest | 375 | Armor | Flak Vest |
| flake | 23 | Drugs | Smoked to give a huge mood boost, cheap to create, highly addictive |
| flatscreentelevision | 1533 | Recreation | Flatscreen Television |
| foxfur | 6 | Leathers | Fox Fur |
| fraggrenades | 442 | Grenades | Frag Grenade |
| fueledsmithy | 333 | Production | FueledSmithy |
| fueledstove | 265 | Production | FueledStove |
| gazelle | 250 | Animal | Gazelle |
| gazellemeat | 3 | Meat | Meat_Gazelle |
| gew43 | 633 | Weapon | Gewehr43 is a semi-auto German WW2 Era rifle |
| gladius | 239 | Melee weapons | MeleeWeapon_Gladius |
| glitterworldmedicine | 83 | Medicine | Highest quality medicine |
| goat | 333 | Animal | Goat |
| goatmeat | 3 | Meat | Meat_Goat |
| go-juice | 88 | Drugs | Go-juice blocks pain and increases melee and shooting abilities. It also enhances movement speed. |
| gold | 17 | Raw resources | Gold |
| goose | 150 | Animal | Goose |
| gooseegg(fert.) | 18 | Eggs (fert.) | EggGooseFertilized |
| grandsculpture | 1967 | Art | A huge sculpture |
| graniteblocks | 2 | Stone blocks | BlocksGranite |
| greatbow | 174 | Ranged weapons | Bow_Great |
| grizzlybear | 1167 | Animal | Bear_Grizzly |
| guineapig | 250 | Animal | GuineaPig |
| guineapigfur | 8 | Leathers | Leather_GuineaPig |
| guineapigmeat | 3 | Meat | Meat_GuineaPig |
| handtailorbench | 262 | Production | HandTailoringBench |
| hare | 83 | Animal | Hare |
| haremeat | 3 | Meat | Meat_Hare |
| hay | 1 | Foods | Hay |
| healermechserum | 2167 | Items | Instantly heals the (what it deems) worst ailment on the recipient. One use. |
| heater | 218 | Temperature | Heater |
| heavyfur | 6 | Leathers | Leather_Heavy |
| heavysmg | 592 | Ranged weapons | Base game Heavy SMG |
| herbalmedicine | 17 | Medicine | Lowest tier Medicine |
| high-explosiveshell | 92 | Mortar shells | Shell_HighExplosive |
| hops | 2 | Plant matter | RawHops |
| horse | 917 | Animal | Horse |
| horsemeat | 3 | Meat | Meat_Horse |
| hospitalbed | 667 | Furniture | HospitalBed |
| humanleather | 7 | Leathers | Human skin |
| humanmeat | 1 | Meat | Mmmm.... |
| husky | 417 | Animal | Husky |
| huskymeat | 3 | Meat | Meat_Husky |
| hyperweave | 15 | Textiles | Hyperweave |
| ibex | 417 | Animal | Ibex |
| ibexmeat | 3 | Meat | Meat_Ibex |
| iedemptrap | 192 | Security | EMP IED (Improvised Explosive Device) |
| iedincendiarytrap | 192 | Security | Incendiary IED (Improvised Explosive Device) |
| iedtrap | 192 | Security | Explosive (default) IED (Improvised Explosive Device) |
| iguana | 167 | Animal | Iguana |
| incendiarylauncher | 567 | Ranged weapons | Gun that makes fires using bolts |
| incendiaryshell | 92 | Mortar shells | Incendiary mortar shell |
| infernocannon | 2333 | Ranged weapons | Large gun that when shot creates a massive fire |
| infinitechemreactor | 5000 | Special | InfiniteChemreactor |
| insectjelly | 13 | Animal products | InsectJelly |
| insectmeat | 1 | Meat | Cannot be eaten. Useful for fuel. |
| jacket | 275 | Apparel | Apparel_Jacket |
| jade | 8 | Raw resources | Jade |
| kar98k | 433 | Weapon | KAR98K is a bolt action rifle, German WW2 era |
| kar98kwithschiessbecher | 633 | Weapon | A KAR98K with a grenade launcher attached |
| kibble | 2 | Foods | Kibble, useful for feeding animals |
| kidney | 417 | Natural | A human kidney. Not much use to Avali, but it's a kidney. |
| knife | 111 | Melee weapons | MeleeWeapon_Knife |
| litemnameadorretriever | 417 | Animal | Labrodor Retriever |
| largesculpture | 517 | Art | SculptureLarge |
| lavishmeal | 67 | Meals | The best meal for the colonists |
| lightleather | 3 | Leathers | Leather_Light |
| limestoneblocks | 2 | Stone blocks | BlocksLimestone |
| liver | 833 | Natural | A human liver. |
| lizardskin | 3 | Leathers | Leather_Lizard |
| longsword | 442 | Melee weapons | MeleeWeapon_LongSword |
| luciferium | 117 | Drugs | Luciferium, a drug that improves all aspects of the user, but once taken, must continue to be taken, forever. Failure to take consistently once started will kill the user. |
| lung | 667 | Natural | A human lung |
| lynx | 417 | Animal | Lynx |
| lynxmeat | 3 | Meat | Meat_Lynx |
| m24stielhandgranate | 358 | Weapon | German WW2 era stick grenade |
| m31feldspaten | 113 | Weapon | German WW2 era field shovel, melee weapon |
| mace | 203 | Melee weapons | MeleeWeapon_Mace |
| machiningtable | 758 | Production | TableMachining |
| marbleblocks | 2 | Stone blocks | BlocksMarble |
| marinearmor | 3392 | Armor | Apparel_PowerArmor |
| marinehelmet | 1058 | Headgear | Apparel_PowerArmorHelmet |
| medicine | 30 | Medicine | Standard grade medicine |
| megascarab | 167 | Animal | Megascarab |
| megascreentelevision | 2475 | Recreation | MegascreenTelevision |
| megasloth | 1167 | Animal | Megasloth |
| megaslothmeat | 3 | Meat | Megasloth meat... uh.... |
| megaslothwool | 4 | Textiles | WoolMegasloth |
| megaspider | 833 | Animal | Megaspider |
| mg34 | 983 | Weapon | MG34 is a German WW2 era Machine Gun |
| mg42 | 875 | Weapon | MG42 is a German WW2 era Machine Gun |
| milk | 5 | Animal products | Milk |
| minigun | 1933 | Ranged weapons | Base game minigun |
| mini-turret | 492 | Security | Turret_MiniTurret |
| molotovcocktails | 408 | Grenades | Molotov Cocktails create fire when thrown. |
| monkey | 167 | Animal | Monkey |
| monkeymeat | 3 | Meat | Meat_Monkey |
| mortar | 1058 | Security | Mortar emplacement |
| mountedmg42 | 1083 | Security | MG42 emplacement, German WW2 Era |
| mp3008 | 281 | Weapon | MP3008 is a German WW2 era SMG, very weak |
| mp35 | 533 | Weapon | MP35 is an early German WW2 era SMG |
| mp40 | 517 | Weapon | MP40 is a German WW2 era SMG |
| mp507 | 358 | Weapon | MP507 is a late German WW2 era SMG, fairly weak |
| muffalo | 500 | Animal | Muffalo |
| muffalomeat | 3 | Meat | Meat_Muffalo |
| muffalowool | 4 | Textiles | WoolMuffalo |
| multi-analyzer | 1700 | Misc | MultiAnalyzer, allows for enhanced research |
| nano-carbonfiber | 6 | Avali resources | NanoCarbonFiber is an advanced Avali resource |
| nanofiber | 3 | Avali resources | NanoFiber is an Avali resource |
| neutroamine | 10 | Manufactured | Basic ingredient in medicine/drugs |
| nutrientpastemeal | 17 | Meals | Very bland, yet nutriotionally fufilling meal |
| orbitalbombardmenttargeter | 2000 | Utility | Targeter for Orbital Bombarbment, single use |
| orbitalpowerbeamtargeter | 2000 | Utility | Targeter for an Orbital Powerbeam, single use |
| orbitaltradebeacon | 185 | Misc | Attracts orbital traders |
| ostrich | 417 | Animal | Ostrich |
| ostrichegg(fert.) | 38 | Eggs (fert.) | EggOstrichFertilized |
| p08 | 425 | Weapon | P08 (Also known as Luger) was a German WW2 era pistol |
| p38 | 315 | Weapon | P38 was a German WW2 era pistol |
| packagedsurvivalmeal | 40 | Meals | A meal that nearly never expires, contains decent quality food |
| panther | 667 | Animal | Panther |
| panthermeat | 3 | Meat | Meat_Panther |
| pantherafur | 5 | Leathers | Leather_Panthera |
| pants | 143 | Apparel | Apparel_Pants |
| panzerfaust60 | 367 | Weapon | The Panzerfaust 60 was a German WW2 single use anti-tank bazooka |
| parka | 315 | Apparel | Apparel_Parka |
| patchleather | 2 | Leathers | Leather_Patch |
| pemmican | 2 | Foods | Pemmican is produced using a basic preservation technique, allowing it to remain unexpired for long periods. It is just meat. |
| penoxycyline | 30 | Drugs | Used to prevent diseases. Safe to use. |
| personacore | 10000 | Items | AI Persona Core, end game item. |
| pig | 333 | Animal | Pig |
| pigskin | 3 | Leathers | Leather_Pig |
| pila | 182 | Ranged weapons | Pila |
| plainleather | 3 | Leathers | Leather_Plain |
| plantpot | 68 | Furniture | PlantPot |
| plasteel | 15 | Raw resources | Plasteel, advanced material |
| platearmor | 792 | Armor | Apparel_PlateArmor |
| pokertable | 400 | Furniture | PokerTable |
| polarbear | 1167 | Animal | Bear_Polar |
| pork | 3 | Meat | Meat_Pig |
| positiveenforcementaugment | 533 | Bionic | Makes avali more friendly to others, however may cause forgetfulness |
| potatoes | 2 | Vegetarian | RawPotatoes |
| powerclaw | 642 | Prosthetic | PowerClaw |
| prostheticarm | 433 | Prosthetic | SimpleProstheticArm |
| prostheticheart | 383 | Prosthetic | SimpleProstheticHeart |
| prostheticleg | 433 | Prosthetic | SimpleProstheticLeg |
| psychicanimalpulser | 1167 | Artifacts | Sends all animals on the map into a rage, single use. Does not affect pets. |
| psychicemanator | 2167 | Special | Creates psychic waves that soothe colonists. Passive effect. |
| psychicfoilhelmet | 417 | Headgear | A helmet to protect against psychic waves. Sadly isn't made of tinfoil. |
| psychicinsanitylance | 1083 | Utility | Whoever is hit by the lance will become insane. Limited use. |
| psychicshocklance | 917 | Utility | Whoever is hit by the lance will go into a state of shock. Limited use. |
| psychicsoothepulser | 1000 | Artifacts | One use, makes everyone happier temporarily. |
| psychitetea | 17 | Drugs | Slight boost to mood and gives energy. Can be addictive. |
| psychoidleaves | 3 | Plant matter | PsychoidLeaves |
| pumpshotgun | 425 | Ranged weapons | Gun_PumpShotgun |
| pzb39 | 808 | Weapon | PZB39 is a German WW2 era Anti-Tank rifle |
| raccoon | 167 | Animal | Raccoon |
| raccoonmeat | 3 | Meat | Meat_Raccoon |
| rat | 58 | Animal | Rat |
| ratmeat | 3 | Meat | Meat_Rat |
| rawfungus | 2 | Vegetarian | RawFungus |
| rawtungsten | 17 | Avali resources | AvaliTungsten |
| reconarmor | 2567 | Armor | Apparel_ArmorRecon |
| reconhelmet | 875 | Headgear | Apparel_ArmorHelmetRecon |
| recurvebow | 110 | Ranged weapons | Bow_Recurve |
| redfox | 333 | Animal | Fox_Red |
| refinedcarbon | 2 | Avali resources | NanoCarbon is an Avali resource |
| reichmachiningtable | 608 | Production | Used to make WW2 German weaponry. |
| resurrectormechserum | 2833 | Items | A one use, resurrection serum. However, it is not perfect, the resurrected indivual may have complications. |
| revolver | 226 | Ranged weapons | Gun_Revolver |
| rhinoceros | 1167 | Animal | Rhinoceros |
| rhinocerosleather | 7 | Leathers | Leather_Rhinoceros |
| rhinocerosmeat | 3 | Meat | Meat_Rhinoceros |
| rice | 2 | Vegetarian | RawRice |
| royalbed | 1467 | Furniture | RoyalBed |
| s84/98iiibayonet | 82 | Weapon | The s84/98 is a German WW2 era bayonet, (it's just a knife here) |
| sandstoneblocks | 2 | Stone blocks | BlocksSandstone |
| sheep | 350 | Animal | Sheep |
| sheepmeat | 3 | Meat | Meat_Sheep |
| sheepwool | 4 | Textiles | WoolSheep |
| shelf | 104 | Furniture | Shelf |
| shieldbelt | 650 | Utility | Apparel_ShieldBelt |
| shortbow | 74 | Ranged weapons | Bow_Short |
| silver | 2 | Raw resources | Silver |
| simplehelmet | 153 | Headgear | Apparel_SimpleHelmet |
| simplemeal | 25 | Meals | A basic meal for the colonists. |
| simpleresearchbench | 350 | Production | SimpleResearchBench |
| skilltrainer(animals) | 1250 | Skilltrainers | Neurotrainer_Animals |
| skilltrainer(artistic) | 1250 | Skilltrainers | Neurotrainer_Artistic |
| skilltrainer(construction) | 1250 | Skilltrainers | Neurotrainer_Construction |
| skilltrainer(cooking) | 1250 | Skilltrainers | Neurotrainer_Cooking |
| skilltrainer(crafting) | 1250 | Skilltrainers | Neurotrainer_Crafting |
| skilltrainer(intellectual) | 1250 | Skilltrainers | Neurotrainer_Intellectual |
| skilltrainer(medical) | 1250 | Skilltrainers | Neurotrainer_Medicine |
| skilltrainer(melee) | 1250 | Skilltrainers | Neurotrainer_Melee |
| skilltrainer(mining) | 1250 | Skilltrainers | Neurotrainer_Mining |
| skilltrainer(plants) | 1250 | Skilltrainers | Neurotrainer_Plants |
| skilltrainer(shooting) | 1250 | Skilltrainers | Neurotrainer_Shooting |
| skilltrainer(social) | 1250 | Skilltrainers | Neurotrainer_Social |
| slateblocks | 2 | Stone blocks | BlocksSlate |
| smallsculpture | 275 | Art | SculptureSmall |
| smokelauncher | 633 | Ranged weapons | Gun_SmokeLauncher |
| smokeshell | 92 | Mortar shells | Shell_Smoke |
| smokeleafjoint | 18 | Drugs | Smokeleaf improves mood, but also increases appetite, reduces focus and slows movement. Can be addictive. |
| smokeleafleaves | 3 | Plant matter | SmokeleafLeaves |
| smokepoppack | 277 | Utility | Apparel_SmokepopBelt |
| sniperrifle | 883 | Ranged weapons | Base game Sniper Rifle |
| snowhare | 83 | Animal | Snowhare |
| socialcapabilityenhancer | 533 | Bionic | SocialEnhancer |
| spear | 322 | Melee weapons | MeleeWeapon_Spear |
| spelopede | 333 | Animal | Spelopede |
| spiketrap | 169 | Security | TrapSpike |
| squirrel | 58 | Animal | Squirrel |
| squirrelmeat | 3 | Meat | Meat_Squirrel |
| standinglamp | 65 | Furniture | StandingLamp |
| standinglamp(blue) | 65 | Furniture | StandingLamp_Blue |
| standinglamp(green) | 65 | Furniture | StandingLamp_Green |
| standinglamp(red) | 65 | Furniture | StandingLamp_Red |
| steel | 3 | Raw resources | Steel |
| stg44 | 683 | Weapon | The STG44 is a WW2 Era German Assault rifle |
| stonecutter'stable | 358 | Production | TableStonecutter |
| stool | 86 | Furniture | Stool |
| sunlamp | 129 | Furniture | SunLamp |
| synthread | 7 | Textiles | Synthread |
| table(1x2) | 98 | Furniture | Table1x2c |
| table(2x2) | 176 | Furniture | Table2x2c |
| table(2x4) | 333 | Furniture | Table2x4c |
| table(3x3) | 350 | Furniture | Table3x3c |
| tailstiffeningaugment | 383 | Bionic | Allows Avali tails to be used as a weapon, plus be able to take more damage, but restricts movement. |
| techprofsubpersonacore | 1667 | Items | One-use, will instantly research whatever you tell it to. |
| telescope | 583 | Recreation | Telescope |
| thrumbo | 6667 | Animal | Thrumbo |
| thrumbohorn | 1333 | Items | ThrumboHorn |
| thrumbomeat | 3 | Meat | Meat_Thrumbo |
| thrumbofur | 23 | Leathers | Leather_Thrumbo |
| timberwolf | 583 | Animal | Wolf_Timber |
| toolcabinet | 642 | Misc | ToolCabinet |
| tornadogenerator | 1333 | Utility | One use, targeted tornado generator. |
| tortoise | 333 | Animal | Tortoise |
| tortoisemeat | 3 | Meat | Meat_Tortoise |
| tribalheaddress | 203 | Headgear | Apparel_TribalHeaddress |
| tribalwear | 211 | Apparel | Apparel_TribalA |
| triplerocketlauncher | 1667 | Ranged weapons | Gun_TripleRocket |
| t-shirt | 143 | Apparel | Apparel_BasicShirt |
| tubetelevision | 525 | Recreation | TubeTelevision |
| tungsten | 20 | Avali resources | AvaliTungstenPowder |
| tuque | 74 | Headgear | Apparel_Tuque |
| turkey | 167 | Animal | Turkey |
| turkeyegg(fert.) | 18 | Eggs (fert.) | EggTurkeyFertilized |
| turkeymeat | 3 | Meat | Meat_Turkey |
| uranium | 10 | Raw resources | Uranium |
| urn | 70 | Furniture | Urn |
| vanometricpowercell | 3500 | Special | Generates electricity, forever, without consuming any resources. |
| venison | 3 | Meat | Meat_Deer |
| vitalsmonitor | 358 | Misc | VitalsMonitor |
| volkspistole | 222 | Weapon | A very weak WW2 era German pistol |
| wake-up | 58 | Drugs | An addictive stimulant. Fills the need for rest, and allows users to work for extended periods without getting tired. |
| warmask | 101 | Headgear | Apparel_WarMask |
| warveil | 75 | Headgear | Apparel_WarVeil |
| warg | 750 | Animal | Warg |
| wargmeat | 3 | Meat | Meat_Warg |
| wildboar | 333 | Animal | WildBoar |
| wolfmeat | 3 | Meat | Meat_Wolf_Timber |
| wolfskin | 5 | Leathers | Leather_Wolf |
| wood | 2 | Raw resources | WoodLog |
| wort | 4 | Manufactured | Wort |
| yak | 533 | Animal | Yak |
| yakbeef | 3 | Meat | Meat_Yak |
| yayo | 35 | Drugs | A fine white powder snorted to produce a euphoric high. Yayo reduces the user's need for rest, and suppresses pain. It is, however, addictive. |
| yorkshireterrier | 167 | Animal | YorkshireTerrier |
| ak-12 | 625 | Ranged weapons | The AK-12 is a modern Soviet assault rifle |
| ak-74 | 425 | Ranged weapons | The AK-74 is an average Soviet assault rifle |
| akm | 375 | Ranged weapons | The AKM is an early Soviet assault rifle |
| aks-74u | 458 | Ranged weapons | The AKS-74u is an average Soviet smg(i dunno its a short version of the ak-74 |
| makarov | 281 | Ranged weapons | The Makarov is a low end Soviet pistol |
| mountedags-17plamya | 1033 | Security | The 17plamya is a Soviet grenade launcher emplacement |
| mountednsvutyos | 708 | Security | The NSV Utyos is a Soviet MG emplacement |
| mr-444 | 375 | Ranged weapons | The MR-444 is a decent Soviet pistol |
| ots-14groza-1 | 550 | Ranged weapons | The OTS-14 Groza-1 is a modern Soviet bullpup smg |
| pkm | 625 | Ranged weapons | The PKM is a Soviet LMG |
| pp-19bizon | 467 | Ranged weapons | The PP-19 Bizon is a Soviet SMG |
| rgs-50 | 500 | Ranged weapons | The RGS-50 is a Soviet Grenade launcher |
| rpg-7 | 958 | Ranged weapons | It's an rpg, what else do I need to say? |
| rpk | 467 | Ranged weapons | The RPK is an early Soviet LMG |
| rpo-zshmel | 742 | Ranged weapons | The RPO-Zshmel is a single use Soviet rocket launcher. |
| saiga-12k | 600 | Ranged weapons | The Saiga-12 is a Soviet automatic shotgun |
| sks-45 | 575 | Ranged weapons | The SKS-45 is a Soviet semi-auto rifle. |
| sovietweapontable | 608 | Production | Used to produce Soviet weaponry |
| svddragunov | 767 | Ranged weapons | The SVD Dragunov is a Soviet sniper rifle |


You can choose what ever you want from the categories below to see reviews about the items in it.
And not just this!! you can also add your own review and comment to share your openion.


Inbox
Today
Projects
New project
New To Do
Select Priority
High
Medium
Low
Select Priority
High
Medium
Low
Modal title
Title
Date
Description
Priority
High
Medium
Low


Abstract: Joy is a functional programming language which is not based on the application of functions to arguments but on the composition of functions. Many topics from the theory of computability are particularly easy to handle within Joy. They include the parameterisation theorem, the recursion theorem and Rice's theorem. Since programs are data, it is possible to define a Y-combinator for recursion and several variants. It follows that there are self-reproducing and self-describing programs in Joy. Practical programs can be written without recursive definitions by using several general purpose recursion combinators which are more intuitive and more efficient than the classical ones.
Keywords: functional programming, functionals, computability, diagonalisation, program = data, diagonalisation, self-reproducing and self-describing programs, hierarchy of recursion combinators, elimination of recursive definitions.
A deep result in the theory of computability concerns the elimination of recursive definitions. To use the stock example, the factorial function can be defined recursively in Joy by
factorial == [0 =] [pop 1] [dup 1 - factorial *] ifteThe definition is then used in programs like this:
5 factorialBecause in Joy programs can be manipulated as data, the factorial function can also be computed recursively without a recursive definition, as follows:
5 [ [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] [dup cons] swap concat dup cons iThe second line in this program does much the same as the body of the definition of factorial, but it is a quoted program. The third line first transforms this into another longer quoted program which performs "anonymous" recursion, and then the final i combinator essentially dequotes this program causing its execution.
The third line implements Joy's counterpart of the Y combinator of the lambda calculus and of combinatory logic. Exactly the same line can be used to cause anonymous recursion of other functions which are normally defined recursively.
Joy has other combinators which make recursive execution of programs more succinct. (Of course it is also possible in Joy to compute the factorial function more efficiently with iteration instead of recursion.)
The remainder of this paper deals with various aspects of the theory of computability, in particular the theory of recursive functions. The next section gives a recursive definition of a recursion combinator. Following that is a section dealing with various well known and elementary theorems from recursive function theory. The next section then proves a fixpoint theorem for Joy. The theorem implies the existence of self-reproducing programs, as shown in the following section. There is also some discussion of the effect of evaluation order on termination. The topic of the next section is Rice's theorem for Joy. Then there is a section describing further self-reproducing and self-describing programs. Another recursion combinator is constructed in the next section. The final section discusses the more practical recursion combinators of Joy. Previous knowledge of the field of recursion theory is not assumed.
In conventional notation the factorial function can be defined recursively like this:
r-fac(n) = if n = 0 then 1 else n * r-fac(n - 1)It is obvious that in conventional notation the definitions need the formal parameter
n
. Joy was designed to eliminate formal
parameters in definitions, and the factorial function would be defined
in Joy like this:
r-fac1 == [0 =] [pop 1] [dup 1 - r-fac1 *] ifteThe suffix
1
serves to distinguish this definition from a
later version. The RHS of the definition contains three quotations:
an if-part, a then-part and an else-part. These serve as parameters
to the ifte combinator. The if-part tests for equality
with 0
, and if that is true then the then-part
pops off the parameter and replaces it with the result
1
. Otherwise the else-part is executed, which
duplicates the parameter, subtracts 1
from the
top copy, calls r-fac1
recursively on that and, when that
call has returned with a value, multiplies that with the original.
Using a more Joy-like idiom:
r-fac1 == [null] [succ] [dup pred r-fac1 *] ifteThis uses the null predicate in the if-part, the successor function in the then-part and the predecessor operator in the else-part.
In conventional notation the Fibonacci function is defined recursively like this:
r-fib(n) = if n <= 1 then n else r-fib(n - 1) + r-fib(n - 2)A more or less literal translation into Joy is the following:
r-fib1 == [small] [] [pred dup [r-fib1] dip pred r-fib1 +] ifteThe if-part uses the small predicate, which for numeric parameters yields
true
for 0
and for
1
. The then-part is the empty quotation []
,
when executed it does nothing. In the else-part r-fib1
has to call itself twice, once each for the two parameters that have
been prepared by dup
. The dip combinator
applies the quotation [r-fib1]
to the earlier version,
and the later version, after pred
has done its job, is
handled directly by r-fib1
. A cleaner version is
r-fib2 == [small] [] [pred dup pred [r-fib2] app2 +] ifteThe app2 combinator applies the quoted
[r-fib2]
twice, to each of the two numbers on top of the
stack.
It will help if the minor differences between the definitions of the
factorial function and the Fibonacci function are eliminated. In
particular this concerns the patterns of the recursive calls. In the
body of r-fac1
the direct recursive call has been
replaced by its quotation and app1, which applies the
quotation just once, to the single number. So here are two other
versions, they have aligned to make comparisons easier.
r-fac2 == [ null] [succ] [ dup pred [r-fac2] app1 *] ifte r-fib2 == [small] [ ] [pred dup pred [r-fib2] app2 +] ifteThe task of eliminating the recursion in the RHS of the definitions amounts to this: The occurrences of the quoted programs
[r-fac2]
and [r-fib2]
have to be replaced by
the quoted RHS. But this will introduce those same quotes again, and
these have to be replaced by the RHS, and so on ad
infinitum. It seems impossible.
One part of the solution is that the programs have to be given an
extra parameter which is to be used when the else-part is executed.
The extra parameter will have to contain whatever is necessary to
enable the recursion inside the else-part. But this means that the
extra parameter will be somewhat in the way. Consequently the if-part
and the then-part need an extra pop
to remove the
unneeded parameter. Furthermore, in the else-part any preparatory
work before the actual recursion has to be done below the
extra parameter using dip
. The one or two recursions are
then to be effected by app1
and app2
,
respectively. The two programs now look like this:
?-fac: [[pop null] [pop succ] [[dup pred ] dip app1 *] ifte] ? ?-fib: [[pop small] [pop ] [[pred dup pred] dip app2 +] ifte] ?To indicate that these are not recursive definitions, they are not given as definitions at all. The
?
-symbol is left unanalysed at this point,
only this much can be said about it:
?
-symbol denotes a strange combinator.
For comparison the three versions of the factorial program are listed here:
r-fac1 == [ null] [ succ] [ dup pred r-fac1 *] ifte r-fac2 == [ null] [ succ] [ dup pred [r-fac2] app1 *] ifte ?-fac: [[pop null] [pop succ] [[dup pred ] dip app1 *] ifte] ?And here are the three versions of the Fibonacci program:
r-fib1 == [ small] [ ] [ pred dup [r-fib1] dip r-fib1 +] ifte r-fib2 == [ small] [ ] [ pred dup pred [r-fib2] app2 +] ifte ?-fib: [[pop small] [pop ] [[pred dup pred] dip app2 +] ifte] ?
The recursion combinator must do this: At the point where
?-fac
uses app1
and where ?fib
uses app2
they expect ?-fac
and
?fib
on top of the stack. That is why the if-parts and
the then-parts each need an extra pop
, and why the
else-part has to do its initial work from a dip
. It all
means that a recursion combinator has to supply the RHS to itself as
an extra parameter. In general, a recursion combinator expects a
program [P]
and it executes it in a special way. It must
call P
but provide the extra parameter. This is the
defining law for a recursion combinator ?
:
[P] ? == [[P] ?] P
How can a recursion combinator be defined? This can be done
recursively and non-recursively. Once the ?
combinator
is defined, it can be used to eliminate all other recursive
definitions. If a recursion combinator is defined recursively, then
this would be the only recursive definition that is needed. Here is a
step-by-step development of such a definition. The development is a
fairly typical example of how one can write Joy programs
systematically. Start with the defining law:
[P] ? == [[P] ?] PIn the second line
P
occurred twice, in quoted and
unquoted form. It will be simpler if it occurs in only one form, and
that has to be the quoted form. So, using the i
combinator,
== [[P] ?] [P] iThe two quotations are not exactly the same, but they can be produced from two identical quotations:
== [[P ?] [[P] ?] first iNow the two identical quotations can be produced by the
dup
operator:
== [[P] ?] dup first iAll that is needed now is to extract
[P]
to the left:
== [P] [?] cons dup first iIn this construction each line was equivalent to its one or two neighbours. Hence the first and the last lines of this construction are equivalent:
[P] ? == [P] [?] cons dup first iHence the following is a suitable recursive definition of a recursion combinator:
? == [?] cons dup first i
It is useful to think of the RHS as being composed of two parts: the first is
[?] cons dup firstand the second part is just
i
. The first part is just a
function which takes one quoted program as a parameter and produces
two quoted programs as values:
[P] [?] cons dup first [[P] ?] dup first (by cons) [[P] ?] [[P] ?] first (by dup) [[P] ?] [P] (by first)The second part of the definition is
i
, which effectively
dequotes the topmost [P]
and hence executes
P
. So the next reduction step depend on what
P
actually does.
An alternative recursive definition may be constructed:
[P] ? == [[P] ?] P == [[P] ?] [P] i == [P] [?] cons [P] i == [P] [P] [[?] cons] dip i == [P] dup [[?] cons] dip iThe resulting alternative recursive definition is
? == dup [[?] cons] dip iIt follows that the two RHSs of the two equivalent definitions are equal:
[?] cons dup first i == dup [[?] cons] dip i(Note that cancellation of the trailing
i
combinator on
both sides is not valid in general, though it would be valid here.)
We now have a recursive definition of recursion. Computationally this
is quite adequate, the recursive definition of any one of the
?
combinators really does make it possible to eliminate
all other recursive definitions. Some of the following sections deal
with the elimination of recursion even for the recursion combinators.
The recursive definition of a recursion combinator can of course also be given in other languages. For an example in the lambda calculus see {Henson87}. For an example in ML see {Sokolowski91}.
The main results in the theory can be divided into two groups: those concerned with the relationships between two such formalisms and those concerned with just one.
The principal results in the first group are that the formalisms are all equivalent, in this sense: Given any two formalisms, for any specification in the one formalism there is a specification in the other formalism such that the two specifications compute the same function. Proofs of such results are always constructive, by exhibiting an algorithm which converts any specification in the one formalism into a specification in the other.
Results in the second group concern just one formalism and often take this form: For any specification S1 having a certain property there is another specification S2 such that the two specifications S1 and S2 are related in some special way. Proofs are again constructive, by exhibiting algorithms for converting S1 into S2.
The algorithms of both groups can be expressed in any of the formalisms. The constructive proofs then look like this: There is a specification S (in formalism F) with the capacity of transforming any specification S1 (in formalism F1) into a specification S2 (in formalism F2, not necessarily different from F1) such that the two specification S1 and S2 are related in a special way. Since the formalisms are universal, the algorithms can be written in the formalism itself, as another specification S. The results then take this form: There is a specification S such that for every specification S1 the result of applying S to S1 yields the required S2.
Historically the theory of computability has been mainly couched in terms of recursive functions, a collection of functions built from a small base by means of a small number of constructors. These functions take natural numbers as arguments and give natural numbers as values. By means of a theoretically elegant (but computationally unfeasible) mapping called Gödel numbering, linguistic entities such as expressions can be assigned a unique number. In this way the functions can be made to "talk about themselves". Any syntactic operation on linguistic entities has a counterpart purely arithmetical operation on natural numbers which are the Gödel numbers of these entities. The theorems are basic to any proper understanding of the the foundations of computer science. But the proofs, when not hand-waiving by appeals to Church's thesis, tend to be forbidding.
The ease of writing S depends crucially on how well the formalism can handle its own specifications. Often it is necessary to use encodings of S1 and S2 into a form which the formalism can handle. In the worst case the encodings are truly ghastly. In the best case the formalism can handle its own specifications very naturally. This is sometimes expressed by the slogan program = data. Most formalisms fare badly on this, including most programming languages.
Some languages can treat their own programs as data; they are Lisp, Snobol, Prolog and their descendants, some macro generators and the command languages based on them. Joy does it at least as well. In these languages programs can operate on other programs or on other data to produce other programs which may then be executed. Because of this, arithmetisation is not necessary, functions can take programs rather than Gödel numbers of programs as arguments, and metatheoretic proof become much easier. {Phillips92} writes
One might wonder how differently recursion theory might be viewed if it had arisen out of practical developments instead of predating them.Indeed, one might speculate how much more natural computability theory would have been if Lisp has been invented thirty years earlier. Readers might want to pursue this topic, see the discussion in {Hofstadter85} starting on p 444, and his very startling conclusion on p 449.
In Joy many metatheoretic proofs are easier still because there are no named formal parameters. Consequently the difficult operation of substituting actual parameters for formal parameters does not occur, and everything is algebra. Reasoning about Joy programs will now be illustrated with a number of classical theorems.
A simple form of the parametrisation theorem states: there is a recursive function taking the Gödel number of an n-ary function F1 as one argument and taking the Gödel number of a numeral as a further argument such that the value of this recursive function is the Gödel number of an n-1-ary function F2 which is obtained by substituting the value of the numeral for the first argument of F1.
Here is the same theorem for Joy. An operand is a numeral (or any other constant) or a quotation.
For any program P and operand X there is a program Q such that Q == [Q] i == X PThe required program
Q
is just the concatenation. But
the theorem can be strengthened:
There is a program O such that for any program P and operand X there is a program Q such that X [P] O == [Q] and Q == [Q] i == X [P] i == X PThe required program
O
is cons
:
X [P] O == X [P] cons == [X P] == [Q]The theorem is rather trivial in Joy. The formalisation of the proof is an overkill. However, many proofs later on will have the same structure, and it may help to get used to that.
The parametrisation theorem generalises to any number m of
arguments that are parametrised. Consequently it is often called the
S-m-n theorem, see {Rogers67}. The "S" stands for
"substitution" - it means that m of the n formal
parameters are replaced by fixed values. In Joy notation repeated
cons
operations can parameterise for any m,
simply by repeating cons
m times.
In recursive function theory it is possible for functions to take other functions as parameters, and since functions are untyped, they can take themselves as parameter. One consequence ot the S-m-n theorem is the diagonalisation theorem: There is a recursive function taking as argument the Gödel number of a function which takes at least one parameter, and giving as value the Gödel number of the function obtained from the given one by substituting itself for the parameter.
Again, the counterpart in Joy is trivial.
For any program P there is a program Q such that [Q] i == Q == [P] PThe required quoted
[Q]
is [[P] P]
. The
stronger form is:
There is a program O such that for any program P there is a program Q such that [P] O == [Q] and [Q] i == Q == [P] dup i == [P] PThe required program
O
is dup cons
. Proof:
[P] O == [P] dup cons == [P] [P] cons == [[P] P] == [Q] [Q] i == [[P] P] i == [P] P == QSo in Joy the short program
dup consimplements diagonalisation.
It may help to see diagonalisation in action for a small program:
[dup reverse concat] dup cons i == [dup reverse concat] [dup reverse concat] cons i (by dup) == [[dup reverse concat] dup reverse concat] i (by cons) == [dup reverse concat] dup reverse concat (by i) == [dup reverse concat] [dup reverse concat] reverse concat(by dup) == [dup reverse concat] [concat reverse dup] concat (by reverse) == [dup reverse concat concat reverse dup] (by concat)So the program
[dup reverse concat]
diagonalised and run
produces its own palindrome. Most programs cannot be self-applied
because it would breach typing. But here are a few, readers might
like to see what they do:
[] [reverse 42] [42 pop] [pop] [dup cons]
In {Smullyan61} theory of formal systems of (character) strings, the
norm or diagonalisation of a string X
is
defined to be X
followed by its own Gödel number in
dyadic notation. In Joy the detour via Gödel number is eliminated
by using quotations.
We now consider two reductions. The first is this:
[P] dup i == [P] [P] i (by dup) == [P] P (by i)The second is this:
[P] dup cons i == [P] [P] cons i (by dup) == [[P] P] i (by cons) == [P] P (by i)So the two reductions come to the same, and hence their first lines are identical:
[P] dup i == [P] dup cons iBut this holds for all
[P]
. So we may infer
dup cons i == dup i
For every function P there is a Gödel number of a function Q such that the result of applying the function P to the Gödel number of Q is the Gödel number of a function identical with Q.The theorem says that for every function P which is used to edit code for computing functions, there is a program Q which will compute the same function before and after the editing. So Q is a fixpoint, a program not affected by P. Fixpoint theorems are about programs
P
(rather than about the functions which they compute).
Here is an equivalent version for Joy:
For any program P there is a program Q such that [Q] i == Q == [Q] PThe required program
Q
is
[dup cons P] dup cons PThe proof is as follows:
[ Q ] i == [[dup cons P] dup cons P] i (def Q) == [dup cons P] dup cons P (by i) == [dup cons P] [dup cons P] cons P (by dup) == [[dup cons P] dup cons P] P (by cons) == [ Q ] P (def Q)
The theorem may be strengthened. The transformation from
P
to Q
can be done by a simple program
O
:
There is a program O such that for any program P there is a program Q such that [P] O == [Q] and [Q] i == Q == [Q] PThe required program
O
is
[dup cons] swap concat dup consThe proof is as follows:
[P] O == [P] [dup cons] swap concat dup cons (def O) == [dup cons] [P] concat dup cons (by swap) == [dup cons P] dup cons (by concat) == [dup cons P] [dup cons P] cons (by dup) == [[dup cons P] dup cons P] (by cons) == [Q] (def Q)The fixpoint finding program
O
is useful: henceforth it
will be called the fix operator. We also define the
y combinator for Joy:
y == fix iThis is the Joy counterpart of Curry's "paradoxical" Y combinator (uppercase), see {Curry58}. This combinator is well known in the literature on the lambda calculus and on combinatory logic.
The recursion theorem traces its ancestry to Epimenides, Russell and
Grelling (for [P]
put [i not]
, and to
Gödel. In its general form it is due to Kleene. Its proof is very
cumbersome in just about all formalisms. As can be seen from the
above, in Joy the proof is very simple.
The S-m-n theorem is the basis for partial evaluation or
program specialisation. A special case for this is the
partial evaluator mix which can transform an interpreter into
a compiler, and can transform itself into a compiler generator.
{Jones92} shows that such transformations can be done realistically
only if the partial evaluator has primitives in terms of which the
fixpoint constructions of the recursion theorem can be implemented
efficiently. The two primitives chosen are in fact very close to
Joy's i
combinator and quotation.
The recursion theorem leads in a few steps to Rice's theorem, see {Rogers67}, which encapsulates all the bad news of computability theory: for example the halting problem, or the impossibility of writing programs which check other programs - implementation, student exercises - for correctness.
P
. It is of some interest to see what happens when some
simple actual programs are chosen. Two particularly simple programs
are
i
combinator program,
which dequotes and executes a program on top of the stack.
S
is self-reproducing if this conditions holds:
S i == SNote that
S
is allowed to be arbitrarily complex, it does
not have to be just a quoted program. Such programs are obtained from
the recursion theorem by making P
compute the identity
function. In Joy this is represented most simply by the empty
program, in quoted form []
. (Alternatively, it is
represented by the program id
, in quoted form
[id]
.)
There is a program Q such that [Q] i == [Q]Proof: let
Q
be the program
[dup cons] dup consThen the derivation is as follows:
[[dup cons] dup cons] i == [dup cons] dup cons (by i) == [dup cons] [dup cons] cons (by dup) == [[dup cons] dup cons] (by cons)Readers might like to be reminded of a self-replicating C-program:
p="p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}(Author unknown. Proving correctness is not easy.)
Related to self-reproducing programs are self-describing
programs. A program S
is self-describing if running
it produces a description of it. In Joy a program S
is
self-describing if this condition holds:
S == [S]Here is a self-describing program:
[dup cons] dup cons == [dup cons] [dup cons] cons (by dup) == [[dup cons] dup cons] (by cons)
i
combinator. Then [P]
is [i]
, and
[Q]
is [[dup cons i] dup cons i]
. This is
what happens:
[[dup cons i] dup cons i] i == [dup cons i] dup cons i (by i) == [dup cons i] [dup cons i] cons i (by dup) == [[dup cons i] dup cons i] i (by cons)So this is a program that runs forever. This is the Joy counterpart of what in the lambda calculus is selfapplication selfapplied. In both the reductions do not terminate. In the lambda calculus the rule used is beta-reduction, the substitution of actual for formal parameters. In Joy there are no formal parameters, just algebraic simplification.
The dup cons
combination occurs so frequently that it is
worth introducing an operator duco defined by
duco == dup consThis will make proofs shorter both horizontally (because programs are shorter) and vertically (because two steps are condensed into one).
[P]
=
dup
. Then [Q]
is the quotation in the first
line below, and execution is as follows:
[[duco dup] duco dup] i == [duco dup] duco dup (by i) == [[duco dup] duco dup] dup (by duco) == [[duco dup] duco dup] [[duco dup] duco dup] (by dup)So this is an example of a program which when run produces two copies of itself. The program in the second line is another self-describing program, it produces two copies of itself.
[P]
= dup i
. Then
execution starts like this:
[[duco dup i] duco dup i] i == [duco dup i] duco dup i (by i) == [[duco dup i] duco dup i] dup i (by duco) == [[duco dup i] duco dup i] [[duco dup i] duco dup i] i (by dup)So this is another program that runs forever. In addition it leaves earlier copies of itself on the stack. In an implementation it must run out of stack space. The program in the second line is again self-describing, but it never finishes what would be a description of infinitely many copies of itself.
Another program that does much the same is
[[duco dup dip] duco dup dip]
duco
operator is used.
[ [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] y == [ [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] fix i (by y) == [ [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] [duco] swap concat duco i (def fix) == [duco] [ [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] concat duco i (by swap) == [ duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] duco i (by concat) == [[ duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] i (by duco) == [ duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte (by i) == [[ duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] duco [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte ] [pop 0 =] [pop pop 1] [[dup 1 -] dip i *] ifte (by duco)At this point the numeric parameter for the computation will be needed. The
ifte
combinator will execute its if-part.
That results in the long two-line quotation being popped off the stack
and the parameter being compared with 0. If that evaluates to
true
, the then-part is executed with the parameters and
the two-line quotation still on top of the stack, The then-part pops
both and replaces them by 1. But if the if-part returns
false
, the else-part is executed, again with the
parameter and the two-line quotation on top of the stack.
First the two-line quotation is set aside by dip
, the
parameter is duplicated and the top copy decremented. Only then the
two-line quotation will be executed by i
. The effect is
to construct a clone of itself with duco
, pushing the
same if-part, then-part and else-part for the contained
ifte
. When that eventually returns, the old parameter
and above it the factorial of the decremented parameter copy are
finally multiplied to give the required factorial of the original
parameter.
In applicative order the expressions are evaluated first and that value is substituted for the formal parameter. If the value of a parameter expression is used repeatedly in the body of the function, then normal order requires repeated evaluation of the expression, whereas applicative order requires only one evaluation. On the other hand, if the body does not require the value at all, then applicative order will have wasted time trying to evaluate the expression. If that evaluation does not terminate at all, then the call of the function will fail to terminate under applicative order although it would have terminated under normal order. Consequently there are some functions that are less defined under applicative order evaluation than they are under normal order.
The Y combinator of the lambda calculus does not work at all for applicative order. No matter what the function is, the call with the Y combinator will try to do the unending sequence of substitutions and hence fail to terminate. Therefore a different version of the Y combinator has to be used, see {Stoy77}, {Henson87}, {Paulson92}, {Winskel93}.
In Joy there are no formal parameters, there is no substitution, and
hence strictly speaking there is no evaluation order. Joy functions
take their actual parameters as values from the stack, and in a way
this resembles applicative order. The y
combinator of Joy always terminates correctly provided that the quoted
program and any of its actual parameters did get onto the stack, and
provided that the quoted program terminates. So there is a difference
between the Y combinator of the lambda calculus under applicative
order, and the y
combinator of Joy. What is the reason?
Consider again, for an arbitrary program [P]
[P] y == [P] fix i == [[duco P] duco P] i == [duco P] duco P == [[duco P] duco P] PThis point is always reached in the initial call, and it is independent of what
P
actually is. At this point there
is a (double) quotation (containing P
twice) on top of
the stack, and P
now has it available as a parameter.
Quotations are never evaluated further, although they can be
explicitly manipulated by operators or they can be explicitly called
by combinators. Consequently the second duco
inside the
quotation will not be executed to yield
== [[[duco P] duco P] duco P] PHere of course the second and third
duco
would have been
the next candidates for execution, and so on. So the reason for the
difference is that quotations in Joy are never evaluated
automatically, whereas abstractions in the lambda calculus will be
under applicative order evaluation.
It is possible to generalise fixpoint combinators for mutual recursion. For the lambda calculus this is done for example by {Kogge91}, shows how pairs of mutually recursive definitions can be eliminated by using a pair of rather complicated mutually recursive combinators Y1 and Y2. A similar technique is explained in {Henson87}. Constructions such as these rely on the existence of double fixpoints, whose existence follows from a double recursion theorem (see for example {Smullyan94}). Presumably these can be translated into Joy, too.
F
of partial
functions and a Joy program [Q]
, the question arises
whether the function computed by [Q]
is in F
or not. Is there an algorithm for deciding such questions? More
specifically, is there a Joy program, say PF
, for
deciding such questions? Such a program would have to satisfy
[Q] PF == true, if the function computed by [Q] is in F == false, if the function computed by [Q] is not in FThe program
PF
is also expected to terminate for all
inputs [Q]
. Can there be such a program?
No. This is Rice's theorem:
For all non-trivial sets F of partial functions, there is no program PF such that for all programs Q PF can decide whether the function computed by Q is in F.Proof: Let
F
be a non-trivial set of functions. Since
F
is non-trivial, there are some functions in
F
and some functions not in F
. Let program
[E]
compute a function in F
and let
[E']
compute a function not in F
.
Now assume that a program PF
exists, and that it always
terminates. Next, consider the following Joy program:
[PF] [pop [E']] [pop [E]] ifteThe program expects an arbitrary program
[Q]
on top of
the stack and then pushes the three small quotations. The
ifte operator then removes them again and executes the
first short quotation [PF]
. This will result in a truth
value, true
or false
. In the first case the
second short quotation is executed, it pop
s the
[PF]
and replaces it by [E']
. In the second
case the third short quotation is executed, it pop
s the
[PF]
and replaces it by [E]
. So, if
[Q]
is in F
, the program returns a program
not in F
, namely [E']
. On the other hand,
if [Q]
is not in F
, the program returns a
program that is in F
, namely [E]
. In other
words, no matter what the input program [Q]
is, the
output program is opposite as far as membership in F
is
concerned. Call the above program OPF
.
By the fixpoint theorem, the program OPF
must have a
fixpoint, say FIXOPF
, satisfying
FIXOPF == [FIXOPF] OPFBut if the program on the left computes a function in
F
,
then the program on the right computes a function not in
F
, and vice versa. But this is a contradiction. So the
program OPF
fails for at least one program, its own
fixpoint FIXOPF
. We must conclude that the assumption
was false. So there cannot be a program PF
.
The above proof of Rice's theorem for Joy is adapted from a proof for
recursive functions in {Phillips92}. Several well-known
paradoxes are instances of the recursion theorem, for example
the Liar paradox and Grelling's paradox use as the
program [P]
the simple program [i not]
.
Recent discussions of the Liar and related problems can be found in
{Martin70} and in {Barwise-Etchemendy87}.
There is an operand Q1 and a program Q2 such that Q1 [Q2] i == Q1 [Q2]Proof: Let
Q1
= [dup]
and let
Q2
= dup
. Then the derivation is
[dup] [dup] i == [dup] dup (by i) == [dup] [dup] (by dup)This seemingly trivial self-reproducing program will be used to derive a version of recursion that is actually more efficient than the one based on the
y
combinator.
b
combinator:
There are programs Q1 and Q2 such that [Q1] [Q2] b == [Q1] [Q2]Proof: let Q1 and Q2 be the programs
[[] cons dup first] [] cons dup firstThen the derivation is:
[[[] cons dup first]] [[] cons dup first] b == [[] cons dup first] [] cons dup first (by b) == [[[] cons dup first]] dup first (by cons) == [[[] cons dup first]] [[[] cons dup first]] first (by dup) == [[[] cons dup first]] [[] cons dup first] (by first)It is useful to introduce an operator codufi by the definition:
codufi == cons dup firstThe operator will be found useful in the next section.
i
combinator:
There is a program Q such that [Q] i i == [Q] =/= [Q] iProof: let
Q
be the program
[duco [] cons] duco [] consThe execution now looks like this:
[[duco [] cons] duco [] cons] i i == [duco [] cons] duco [] cons i (by i) == [[duco [] cons] duco [] cons] [] cons i (by duco) == [[[duco [] cons] duco [] cons]] i (by cons) == [[duco [] cons] duco [] cons] (by i)Observe that the quoted programs in the first and fourth line differ by just the extra quoting in line four.
There is another program with the property.
Let Q
be the program
[false [not] infra dup rest cons] [not] infra dup rest consThe combinator infra expects a program (here
[not]
) on top of the stack, and below that a quotation
(here the first half of the program). It temporarily turns the
quotation into the stack and executes the program (here it complements
the truth value false
or true
at the very
beginning. An outline of the derivation is:
[[false [not] infra dup rest cons] [not] infra dup rest cons] i i [[true [not] infra dup rest cons] [not] infra dup rest cons] i [[false [not] infra dup rest cons] [not] infra dup rest cons](Each by 5 steps)
The quoted programs the first and second lines are examples of mutually describing programs, satisfying
P = [Q] and Q == [P]In detail:
P == [false [not] infra dup rest cons] [not] infra dup rest cons Q == [true [not] infra dup rest cons] [not] infra dup rest cons
true
or
false
) which is thrown every time it is called. The next
program does the same with a counter, and consequently every
generation is different from all previous ones: Let Q
be
the program
[0 [1 +] infra dup rest cons] [1 +] infra dup rest consSuccessive executions using
i
cause the 0
to
be incremented to 1
, 2
and so on.
first
and rest
or sequences of such
operations. There are programs which with every generation become
less and less sensitive to longer and longer sequences of mutilations.
 P [Q]where the
i
on the left and the P
on the
right are repeated the same number of times. Here is one answer:
There is a program O such that for all programs P there is a program Q such that [P] O == [Q] and [Q] i == Q == P [Q]Proof: Let
O
be the program
[dup [first i] dip rest duco] cons ducoThen for any
P
:
[P] O == [P] [dup [first i] dip rest duco] cons duco (by O) == [[P] dup [first i] dip rest duco] duco (by cons) == [[[P] dup [first i] dip rest duco] [P] dup [first i] dip rest duco] (by duco)
y
combinator there are other recursion
combinators. One of them is given by the following theorem:
There is a program M such that (1) [y] M == [y] i == y and for some programs N and O (2a) [M] [duco] swap concat == [N] and (2b) [N] duco == [O] and (3) [M] y == [N] dup i == O and for all programs P (4) [P] O == [P] y and there is a program Q such that (5) [P] [O] cons == [Q] and (6) [Q] i == Q == [Q] PThe first line, (1), says that
y
is a fixpoint for
M
. Lines (2a) and (2b) show how to construct two further
programs N
and O
. Line (3) expresses a
relationship between the three programs M
, N
and O
. Line (5) shows how to construct a program
Q
which depends on P
. The last line of the
theorem says that the Q
is a fixpoint for P
.
Proof: Only M
need be given, because
N
and O
are constructed. The required
M
is actually a combinator already seen in section 2:
cons dup first iBut the first three operators can be replaced by codufi defined in the previous section.
Different recursion combinators, and indeed a whole hierarchy of them, are well known in the literature on lambda calculus and combinatory logic; see for example {Barendregt84}, {Henson87}, {Revesz88}. Possibly one of the most satisfying introductions to combinatory logic is to be found in the remarkable little book {Smullyan90} To Mock a Mockingbird in which he manages to combine humour and rigour. Part III is a self-contained exposition to combinatory logic in which fancyful names are given to lambda calculus combinators.
r-last
finds the last element of a list. The
function r-fac
computes the factorial of a
number. The function r-fib
computes the
Fibonacci value of a number.
r-last == [rest null] [first] [rest r-last] ifte r-fac == [0 =] [succ] [dup pred r-fac *] ifte r-fib == [small] [pop 1] [pred dup pred [r-fib] app2 +] ifteThe following three functions also compute The last, the factorial and the Fibonacci of their parameter. Note that there is no definition; the recursion is taken care of by the
y
combinator.
[ [pop rest null] [pop first] [[rest] dip i] ifte ] y [ [pop 0 =] [pop succ] [[dup pred] dip i *] ifte ] y [ [pop small] [pop pop 1] [[pred dup pred] dip app2 +] ifte] y
But the y
combinator is intrisically inefficient because
of the way it operates. On every recursive call a certain program is
popped off the stack to be executed. The first task of that program
is to construct a copy of itself, in readiness for any further
recursive calls. But this is really quite silly. It would be better
more efficient if the program to be executed was not popped
off the stack at all but simply left there. Whereas most combinators
remove their parameters from the stack, a new x combinator
leaves it there as a parameter for itself.
The following programs use the x
combinator instead of
the y
combinator. They are obtained from the first two
of the previous programs by replacing the internal occurrences of the
i
combinator and the the external occurrence of the
y
combinator by the x
combinator.
[ [pop rest null] [pop first] [[rest] dip x] ifte ] x [ [pop 0 =] [pop succ] [[dup pred] dip x *] ifte ] xThe
x
combinator might have been defined by
x == dup i
Similar lambda calculus constructions are discussed in {Tennent76}, {Bauer-Woessner82}, {Schmidt86} and {Tennent91}.
The remainder of this section describes some further general and particular combinators of Joy which can be used to avoid recursive definitions.
false
, the rec1-part is executed. Following that
the four program parameters and the combinator are again pushed onto
the stack bundled up in a quoted form. Then the rec2-part is
executed, where it will find the bundled form. Typically it will then
execute the bundled form, either with i
or with
app2
, or some other combinator.
g-fac == [null ] [succ] [dup pred ] [i * ] genrec; g-fib == [small] [ ] [pred dup pred] [app2 +] genrec;
genrec
combinator.
The essential difference is that the bundled up quotation is
immediately called before the rec2-part. Consequently it can only be
used for linear recursion. Here are programs for finding the
last
of an aggregate or the Fibonacci value of a natural
number:
l-last == [rest null] [first] [rest ] [ ] linrec; l-fac == [null ] [succ ] [dup pred] [*] linrec
b-fib == [small] [] [pred dup pred ] [+ ] binrec; b-qsort == [small] [] [uncons [>] split] [swap23 cons concat] binrec;
linrec
combinator, except that it does not have a
rec2-part. It can only be used for tail recursion, such as
in the program below which returns the last element of an aggregate.
t-last == [rest null] [first] [rest] tailrec;
null
. The rec1-part is also built in, for numeric
parameters it returns the parameter and its predecessor, for aggregate
parameters it returns the first
of the aggregate and the
rest
of the aggregate. Recursion then occurs
respectively on the predecessor or the rest, and the rudimentary
rec2-part typically combines the results.
The first program below computes the factorial (again!). The second turns any aggregate into a list. The third turns a suitable list of small numbers into a set. The fourth and fifth capitalise lists or strings of lowercase letters and produce, respectively, a list or string of corresponding capital letters. The last program takes an aggregate as parameter and produces a list of every second element in the original order and then the other elements in the reverse order.
p-fac == [1 ] [* ] primrec agg2list == [[]] [cons ] primrec list2set == [{}] [cons ] primrec capstring == [""] [[32 -] dip cons] primrec caplist == [[]] [[32 -] dip cons] primrec fancy == [[]] [reverse cons ] primrec


2021 CVPR Workshops SRFlow-DA: Super-Resolution Using Normalizing Flow with Deep Convolutional Block Jo, Younghyun, Yang, Sejong, and Kim, Seon Joo In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops 2021 PDF Code CVPR Practical Single-Image Super-Resolution Using Look-Up Table Jo, Younghyun, and Kim, Seon Joo In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) 2021 PDF Supp Code CVPR Tackling the Ill-Posedness of Super-Resolution Through Adaptive Target Generation Jo, Younghyun, Oh, Seoung Wug, Vajda, Peter, and Kim, Seon Joo In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) 2021 PDF Supp Code 2020 ECCV Deep Space-Time Video Upsampling Networks Kang, Jaeyeon, Jo, Younghyun, Oh, Seoung Wug, Vajda, Peter, and Kim, Seon Joo In The European Conference on Computer Vision (ECCV) 2020 PDF Supp Code Demo CVPR Workshops Investigating loss functions for extreme super-resolution Jo, Younghyun, Yang, Sejong, and Kim, Seon Joo In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops 2020 PDF Code arXiv Learning the Loss Functions in a Discriminative Space for Video Restoration Jo, Younghyun, Kang, Jaeyeon, Oh, Seoung Wug, Nam, Seonghyeon, Vajda, Peter, and Kim, Seon Joo arXiv preprint arXiv:2003.09124 2020 arXiv 2018 CVPR Deep video super-resolution network using dynamic upsampling filters without explicit motion compensation Jo, Younghyun, Oh, Seoung Wug, Kang, Jaeyeon, and Kim, Seon Joo In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) 2018 PDF Code Demo


Langer edges Team Goosen in dramatic 3-way playoff
Orlando - Bernhard Langer and son, Jason, fired a round of 60 (-12) before clinching victory with a dramatic eagle on the first hole of sudden death over Team Goosen and Team Lehman at the 2019 Father Son Challenge at The Ritz-Carlton Golf Club Orlando.
Only two partnerships in the last 14 years have prevailed when trailing overnight, but that did not stop Team Langer, who came from two strokes behind to lift the coveted Will Park Trophy with a spectacular eagle back at No. 18.
Langer is now solo second in the all-time list of tournament winners behind Raymond Floyd (5).
On a low scoring morning in Orlando, it was Team Daly that made an early run up the leaderboard, going seven under through seven holes, before the lead switched hands between the overnight leaders Team Goosen, Team Langer and Team Lehman.
A three-time winner here at The Ritz-Carlton Golf Club, including once with Jason in 2014, Langer matched Lehman's opening nine of 29 to lead by one at the turn, with Team Goosen a further one adrift.
Trading blows throughout the back nine, Team Lehman birdied Nos. 17 and 18 to post the clubhouse lead at 24-under-par, only for Team Goosen and Team Langer to join them with closing birdies of their own.
Cue the fifth playoff in tournament history and first since 2015.
With all six players heading back down the par 5 18th hole, the crowds knew it would take something special to break the deadlock.
Jason Langer stepped up.
Taking his father's drive in the fairway, 19-year-old Jason hit a 270 yard 3-wood to 16ft before calmly rolling in the putt to break the deadlock at the first time of asking.
Commenting on the victory, Langer said, "I've seen clutch shots in majors and Ryder Cups, all over the place. For our family it doesn't get much better than that one."
Leading overnight and always gracious in defeat, Goosen said, "Almost in this game, unfortunately, doesn't count. We've finished second in this event three times now in the last four years. It's a little disappointing to me. Playoffs have not been kind to me this year. I feel bad for my son, because we were unfortunately on the losing end."
- Father Son Challenge


{% extends "pages/formulario/baseform.html" %}{% load tinycontent_tags %} {% block content %}
Designed by Adrian Garate and Giulia Martinelli - Icons Created by Javier Ñuño from the Noun Project


@* * Copyright 2021 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @import play.api.Configuration @import uk.gov.hmrc.agentsexternalstubsfrontend.models._ @import uk.gov.hmrc.agentsexternalstubsfrontend.controllers._ @import uk.gov.hmrc.agentsexternalstubsfrontend.controllers.IdentityVerificationController.UpliftRequest @import uk.gov.hmrc.agentsexternalstubsfrontend.views.html.main_template @import uk.gov.hmrc.play.views.html.helpers._ @this(mainTemplate: main_template, form: FormWithCSRF, input: Input, inputRadioGroup: InputRadioGroup, errorSummary: ErrorSummary) @(pageForm: Form[UpliftRequest], options: Seq[(String, String)], formAction: Call)(implicit request: Request[_], messages: Messages, configuration: Configuration) @mainTemplate(title = Messages("login.title"), bodyClasses = None) {


This may take several minutes; please do not close your browser or use the back button.


--- layout: post status: publish published: true title: Epstein makes contact with Zambrano author: display_name: Corey Fineran login: Corey email<EMAIL_ADDRESS>url: '' author_login: Corey author_email<EMAIL_ADDRESS>wordpress_id: 6370 wordpress_url: http://ivyenvy.com/?p=6370 date: '2011-11-12 10:23:51 +0000' date_gmt: '2011-11-12 16:23:51 +0000' categories: - Management - Starting Pitching - Trades - Free Agency tags: - Carlos Zambrano - Jim Hendry - Ozzie Guillen - Royals - Albert Pujols - Marlins - Theo Epstein - Jed Hoyer - Venezuelan Winter League - Mike Maddux - Dale Sveum - Pete Mackanin - Sandy Alomar Jr. - MLB Trade Rumors - Dayton Moore - Scott Krinch - CSNChicago.com comments: - id: 4997 author: Andy author_email<EMAIL_ADDRESS>author_url: '' date: '2011-11-12 15:08:46 +0000' date_gmt: '2011-11-12 21:08:46 +0000' content: I might be interested in Z if I were a small market team. I think it might be worth the risk for a team like the Royals. They would get a pitcher with a lot of upside, and the Cubs would still be paying some of the contract. ---
With the massive changes to the Cubs front office this off-season, there are many story-lines that will make the next few months pretty entertaining for Cubs fans. Of course, the manager search is in the forefront. It appears that the interview process is ending with Sandy Alomar Jr and he will be in competition with Mike Maddux, Dale Sveum and Pete Mackanin for the position. There is, of course, the usual free agency wheeling and dealing that typically occupies us in the winter months. This year, Cubs fans are probably keeping a closer watch on the moves, given that Theo Epstein and Jed Hoyer are at the helm. I personally don't expect the Cubs to make any huge splashes with the free agents, but I think we'll see smarter contracts with the moves they do make. That's a win in my book.
One of the most interesting story lines to follow is Carlos Zambrano. I bet you've never heard that sentence before, have you? Over the last number of years, depending on the day and who you read/listen to, Big Z has either been the biggest asset or the biggest problem on the Cubs. He is the official enigma of the Chicago Cubs.
Two months ago, I would have put big money on Zambrano never throwing a pitch for the Cubs again. Now, I'm not so sure. While Zambrano is pitching in the Venezuelan Winter League, Epstein is probably gathering information and coming up with a plan. Epstein had been in his position for just a few days and he was already speaking with Zambrano's agent and people within the organization that were familiar with Zambrano. MLB Trade Rumors has reported that Zambrano has received a "friendly" phone call from Epstein and the two will meet in person. Notice that the Venezuelan reporter that got the information from Carlos Zambrano is also named Carlos Zambrano. Sounds a little fishy to me.
Given Epstein's apparent desire to chart his own path with the Cubs, I think there's a good chance that Zambrano will be back with the Cubs in 2012. Epstein does not seem to feel any obligation to continue in the direction that Jim Hendry was headed. He's put in "his guys" and is determined to come to his own conclusions with players and personnel. Because of this, I expect him to give Zambrano the opportunity to prove himself and make his case to stay in Chicago. But at the same time, I believe Epstein will look at all of the factors and make a decision on the situation with the organization in mind.
On a side-note, on the most recent podcast episode, we joked about the story on ESPN.com entitled "Royals Open to Zambrano Deal". If you read the article, you find out that the Royals GM, Dayton Moore, simply said that he would be interested in Zambrano if the Cubs were willing to give him away. That was a comment that probably could have been allowed to pass without ESPN acting like the Cubs and Royals are ready to hash this thing out.
I expected that story to fade away pretty quickly, but in an article on CSNChicago.com, Scott Krinch writes
"With the rumor mill churning this offseason, the two teams that have shown the most interest in Zambrano are the Marlins and Royals.
There has been talk of Zambrano joining Ozzie Guillen in Miami. Albert Pujols not only visited the Marlins, but was offered a contract from them. While I hadn't heard anything specific about interest between the Marlins and Zambrano, I thought maybe I had just missed it. I was only able to find one recent article on Zambrano and the Marlins. It was a report from Buster Olney that there "isn't a lot of favor" within the Marlins organization for Zambrano.
I guess it just goes to show how little information is actually needed in the free agent rumor-mill.


textarea
wysimd
# What you see is markdown **WYSIMD** is an [Angular directive](https://docs.angularjs.org/guide/directive) that supplies a rich-text _WYSIWYG_ [contentEditable](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_Editable) backed by an ngModel storing [Markdown](https://daringfireball.net/projects/markdown/). ## Basic formatting Try emphasizing text in **bold** or _italics_ by surrounding text in \*\* or \_. Render text in a `monospace font` by surrounding it with \`. Insert [links](http://google.com) using \[name\]\(url\). ## Lists Use \* and 1. to specify lists: * Bullet lists * Like this * and this or 1. Numbered lists 1. List this 1. and this ## Blockquote Text Quote a block of text by indenting it with > > Quoth the Raven "Nevermore." ## Preformatted Text Make a block of text preformatted by indenting it 4 spaces. function foo() { console.log('hello world'); } ## Tables | Header 1 | Header 2| |----------|---------| | Cell A | Cell B | | Cell C | Cell D |
Editable
Paragraph
Heading 1
Heading 2
Blockquote
Codeblock
B
I
UL
OL


We exchange cats!
- unleash frictionless content
- reintermediate strategic platforms
- e-enable leading-edge infomediaries
- empower dot-com functionalities
- exploit frictionless users
- envisioneer proactive content
- enhance 24/7 methodologies
- repurpose real-time technologies
- repurpose bleeding-edge communities
- enable virtual portals
- target web-enabled supply-chains
- engage user-centric metrics


| Field Summary | ||
|---|---|---|
const Number | BOTTOM | |
| Represents bottom text alignment. | ||
const Number | CENTER | |
| Represents center text alignment. | ||
const Number | CENTER_ACROSS | |
| Represents center across text alignment. | ||
const Number | DISTRIBUTED | |
| Represents distributed text alignment. | ||
const Number | FILL | |
| Represents fill text alignment. | ||
const Number | GENERAL | |
| Represents general text alignment. | ||
const Number | JUSTIFY | |
| Represents justify text alignment. | ||
const Number | LEFT | |
| Represents left text alignment. | ||
const Number | RIGHT | |
| Represents right text alignment. | ||
const Number | TOP | |
| Represents top text alignment. | ||
const Number | JUSTIFIED_LOW | |
| Aligns the text with an adjusted kashida length for Arabic text. | ||
const Number | THAI_DISTRIBUTED | |
| Distributes Thai text specially, because each character is treated as a word. |
| Field Detail |
|---|
BOTTOM | |
const Number BOTTOM |
CENTER | |
const Number CENTER |
CENTER_ACROSS | |
const Number CENTER_ACROSS |
DISTRIBUTED | |
const Number DISTRIBUTED |
FILL | |
const Number FILL |
GENERAL | |
const Number GENERAL |
JUSTIFY | |
const Number JUSTIFY |
LEFT | |
const Number LEFT |
RIGHT | |
const Number RIGHT |
TOP | |
const Number TOP |
JUSTIFIED_LOW | |
const Number JUSTIFIED_LOW |
THAI_DISTRIBUTED | |
const Number THAI_DISTRIBUTED |


Welcome to Towan.us ! This gaming website is a students project that was created with love and devotion!
We hope you will have a lot of fun playing our game and being a part of our great gaming community.
- How many towers will YOU build?
- How many enemies will YOU slay?
- How many waves will YOU survive?
Try to improve and try to give your best. Every wave will be more challenging so be prepared. We are sure you will become better every single time
and do not hesitate to compare yourself and to compete with other users.
We wish you tons of fun because we had fun creating this project for sure ;-)
All the best!
Your TOWAN.US Team


Special Packages
5 daays 6 nights 5 star accomodation
transportation food facilities
2544 review
6 daays 7 nights 5 star accomodation
5 days 4nights 5 star accomodation
an>2544 review
5 daays 6 nights accomodation