xbe.at

Miscellany / AI applications and systems

John McCarthy - Father of Artificial Intelligence

9 min read, 15 sections

Contents
  1. John McCarthy - Father of Artificial Intelligence
  2. Early Life and Education
  3. The Birth of Artificial Intelligence
  4. LISP - A Language for AI
  5. The McCarthy Formalism
  6. Time-sharing Systems
  7. The Frame Problem
  8. Circumscription
  9. The Advice Taker
  10. McCarthy's Legacy
  11. Current Research Directions
  12. Further Reading and Research Directions
  13. McCarthy's Vision for AI
  14. The Ethical Dimensions of AI
  15. McCarthy's Lasting Impact

John McCarthy - Father of Artificial Intelligence

John McCarthy was a pioneering computer scientist and cognitive scientist who played a crucial role in shaping the field of Artificial Intelligence (AI). His work laid the foundation for many of the AI technologies we use today, from machine learning algorithms to natural language processing systems.

Early Life and Education

Born on September 4, 1927, in Boston, Massachusetts, McCarthy showed an early aptitude for mathematics and logic. He entered the California Institute of Technology at age 16, where he studied mathematics. After serving in the U.S. Army during World War II, he completed his Ph.D. in mathematics at Princeton University in 1951 under the supervision of Solomon Lefschetz.

The Birth of Artificial Intelligence

In 1955, McCarthy coined the term "Artificial Intelligence" while organizing the Dartmouth Conference, which is widely considered the founding event of AI as a field. This conference brought together leading researchers to explore the possibility of creating machines that could think and learn like humans.

import matplotlib.pyplot as plt
import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

x = np.linspace(-10, 10, 100)
y = sigmoid(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y)
plt.title("Sigmoid Function: A Key Component in Early AI")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()

LISP - A Language for AI

One of McCarthy's most significant contributions was the creation of LISP (LISt Processor) in 1958. LISP was the first programming language designed specifically for AI applications, introducing concepts like tree data structures, automatic storage management, and symbolic expressions.

# Python implementation of a simple LISP-like interpreter
def tokenize(chars):
    return chars.replace('(', ' ( ').replace(')', ' ) ').split()

def parse(tokens):
    if len(tokens) == 0:
        raise SyntaxError('Unexpected EOF')
    token = tokens.pop(0)
    if token == '(':
        L = []
        while tokens[0] != ')':
            L.append(parse(tokens))
        tokens.pop(0)
        return L
    elif token == ')':
        raise SyntaxError('Unexpected )')
    else:
        return atom(token)

def atom(token):
    try: return int(token)
    except ValueError:
        try: return float(token)
        except ValueError:
            return str(token)

def evaluate(x):
    if isinstance(x, str):
        return x
    elif not isinstance(x, list):
        return x
    else:
        proc = evaluate(x[0])
        args = [evaluate(arg) for arg in x[1:]]
        return proc(*args)

# Example usage
program = "(+ 1 (* 2 3))"
tokens = tokenize(program)
parsed = parse(tokens)
result = evaluate(parsed)
print(f"Result: {result}")

The McCarthy Formalism

McCarthy developed a mathematical formalism for AI reasoning called the Situation Calculus. This formalism provided a way to represent and reason about actions, their preconditions, and their effects in a logical framework.

class Situation:
    def __init__(self, facts):
        self.facts = set(facts)

    def holds(self, fact):
        return fact in self.facts

    def result(self, action):
        new_facts = self.facts.()
        for effect in action.effects:
            if effect.condition(self):
                if effect.positive:
                    new_facts.add(effect.fact)
                else:
                    new_facts.discard(effect.fact)
        return Situation(new_facts)

class Action:
    def __init__(self, name, preconditions, effects):
        self.name = name
        self.preconditions = preconditions
        self.effects = effects

    def is_applicable(self, situation):
        return all(p(situation) for p in self.preconditions)

class Effect:
    def __init__(self, condition, fact, positive=True):
        self.condition = condition
        self.fact = fact
        self.positive = positive

# Example usage
initial_situation = Situation({"at(robot, room1)", "holding(robot, ball)"})
move_action = Action(
    "move",
    preconditions=[lambda s: s.holds("at(robot, room1)")],
    effects=[
        Effect(lambda s: True, "at(robot, room2)", positive=True),
        Effect(lambda s: True, "at(robot, room1)", positive=False)
    ]
)

if move_action.is_applicable(initial_situation):
    new_situation = initial_situation.result(move_action)
    print("New situation:", new_situation.facts)
else:
    print("Action not applicable")

Time-sharing Systems

McCarthy was instrumental in developing time-sharing computer systems, which allowed multiple users to interact with a computer simultaneously. This concept laid the groundwork for modern multi-user operating systems and cloud computing.

import threading
import time
import random

class TimeSharing:
    def __init__(self, num_users):
        self.num_users = num_users
        self.current_user = 0
        self.lock = threading.Lock()

    def user_process(self, user_id):
        while True:
            with self.lock:
                if self.current_user == user_id:
                    print(f"User {user_id} is using the system")
                    time.sleep(random.uniform(0.1, 0.5))
                    self.current_user = (self.current_user + 1) % self.num_users

    def run(self):
        threads = []
        for i in range(self.num_users):
            t = threading.Thread(target=self.user_process, args=(i,))
            threads.append(t)
            t.start()

        for t in threads:
            t.join()

ts = TimeSharing(5)
ts.run()

The Frame Problem

McCarthy identified and formalized the Frame Problem in AI, which addresses the challenge of efficiently representing and updating knowledge about the world as actions occur. This problem remains central to AI research today.

class World:
    def __init__(self, initial_state):
        self.state = initial_state

    def apply_action(self, action):
        new_state = self.state.()
        for effect in action.effects:
            new_state[effect.property] = effect.new_value
        return World(new_state)

class Action:
    def __init__(self, name, effects):
        self.name = name
        self.effects = effects

class Effect:
    def __init__(self, property, new_value):
        self.property = property
        self.new_value = new_value

# Initial world state
initial_state = {
    "robot_location": "room1",
    "ball_location": "room1",
    "robot_holding": None
}

# Define actions
move_to_room2 = Action("move_to_room2", [Effect("robot_location", "room2")])
pick_up_ball = Action("pick_up_ball", [Effect("robot_holding", "ball")])

# Simulate actions
world = World(initial_state)
print("Initial state:", world.state)

world = world.apply_action(move_to_room2)
print("After moving to room2:", world.state)

world = world.apply_action(pick_up_ball)
print("After picking up ball:", world.state)

Circumscription

McCarthy introduced circumscription, a non-monotonic logic formalism for reasoning about default assumptions and exceptions. This approach allows AI systems to make plausible inferences in the absence of complete information.

def circumscription(predicates, fixed_predicates, domain):
    def is_minimal(model):
        for alt_model in generate_models(domain):
            if all(fixed_predicates[p] == alt_model[p] for p in fixed_predicates):
                if all(alt_model[p] <= model[p] for p in predicates):
                    if any(alt_model[p] < model[p] for p in predicates):
                        return False
        return True

    return [model for model in generate_models(domain) if is_minimal(model)]

def generate_models(domain):
    # Simplified model generation
    return [
        {"flies": True, "bird": True},
        {"flies": False, "bird": True},
        {"flies": True, "bird": False},
        {"flies": False, "bird": False}
    ]

predicates = ["flies"]
fixed_predicates = {"bird": True}
domain = {"tweety"}

minimal_models = circumscription(predicates, fixed_predicates, domain)
print("Minimal models:", minimal_models)

The Advice Taker

McCarthy proposed the Advice Taker, an early conceptual AI system capable of learning from human input and improving its performance over time. This idea foreshadowed modern approaches to machine learning and human-AI collaboration.

class AdviceTaker:
    def __init__(self):
        self.knowledge_base = set()

    def add_fact(self, fact):
        self.knowledge_base.add(fact)

    def query(self, question):
        return question in self.knowledge_base

    def learn_from_advice(self, premise, conclusion):
        if premise in self.knowledge_base:
            self.add_fact(conclusion)
            return True
        return False

# Example usage
at = AdviceTaker()

# Add initial knowledge
at.add_fact("Socrates is a man")

# Query the system
print("Is Socrates a man?", at.query("Socrates is a man"))
print("Is Socrates mortal?", at.query("Socrates is mortal"))

# Provide advice
at.learn_from_advice("Socrates is a man", "Socrates is mortal")

# Query again
print("Is Socrates mortal?", at.query("Socrates is mortal"))

McCarthy's Legacy

John McCarthy's work continues to influence AI research and development today. His ideas on knowledge representation, reasoning, and language processing remain fundamental to many AI systems and approaches.

import networkx as nx
import matplotlib.pyplot as plt

def create_influence_graph():
    G = nx.DiGraph()
    G.add_edge("John McCarthy", "Artificial Intelligence")
    G.add_edge("John McCarthy", "LISP")
    G.add_edge("John McCarthy", "Knowledge Representation")
    G.add_edge("John McCarthy", "Reasoning Systems")
    G.add_edge("John McCarthy", "Time-sharing Systems")
    G.add_edge("Artificial Intelligence", "Machine Learning")
    G.add_edge("Artificial Intelligence", "Natural Language Processing")
    G.add_edge("LISP", "Functional Programming")
    G.add_edge("Knowledge Representation", "Expert Systems")
    G.add_edge("Reasoning Systems", "Automated Theorem Proving")
    G.add_edge("Time-sharing Systems", "Cloud Computing")

    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=3000, font_size=8, font_weight='bold')
    edge_labels = nx.get_edge_attributes(G, 'weight')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

    plt.title("John McCarthy's Influence on Computer Science")
    plt.axis('off')
    plt.tight_layout()
    plt.show()

create_influence_graph()

Current Research Directions

Today, researchers continue to build on McCarthy's foundational work, exploring areas such as deep learning, reinforcement learning, and artificial general intelligence. These fields aim to create more flexible and capable AI systems that can reason, learn, and adapt in complex environments.

import numpy as np
import matplotlib.pyplot as plt

def plot_research_trends():
    years = np.arange(1960, 2025, 5)
    ai_interest = 10 * np.exp((years - 1960) / 30)
    deep_learning = 100 * np.exp((years - 2010) / 10)
    deep_learning[years < 2010] = 0

    plt.figure(figsize=(12, 6))
    plt.plot(years, ai_interest, label='General AI Interest')
    plt.plot(years, deep_learning, label='Deep Learning')
    plt.title('Trends in AI Research')
    plt.xlabel('Year')
    plt.ylabel('Research Activity (arbitrary units)')
    plt.yscale('log')
    plt.legend()
    plt.grid(True)
    plt.show()

plot_research_trends()

Further Reading and Research Directions

John McCarthy's work continues to influence modern AI research. Key areas of ongoing investigation include:

  1. Knowledge representation and reasoning
  2. Non-monotonic logic and default reasoning
  3. Formal methods for AI safety and ethics
  4. Integration of symbolic AI with machine learning

Recommended resources:

  1. "LISP 1.5 Programmer's Manual" by John McCarthy et al.
  2. "Programs with Common Sense" by John McCarthy (1959)
  3. "Circumscription—A Form of Non-Monotonic Reasoning" by John McCarthy (1980)
  4. "What is Artificial Intelligence?" by John McCarthy (2007)
import matplotlib.pyplot as plt
import numpy as np

def plot_research_areas():
    areas = ['Knowledge Representation', 'Non-monotonic Logic', 'AI Safety', 'Symbolic AI + ML']
    importance = np.array([0.8, 0.6, 0.9, 0.7])
    current_activity = np.array([0.5, 0.4, 0.8, 0.9])

    x = np.arange(len(areas))
    width = 0.35

    fig, ax = plt.subplots(figsize=(10, 6))
    ax.bar(x - width/2, importance, width, label='Historical Importance')
    ax.bar(x + width/2, current_activity, width, label='Current Research Activity')

    ax.set_ylabel('Relative Scale')
    ax.set_title('McCarthy\'s Influence on Current AI Research')
    ax.set_xticks(x)
    ax.set_xticklabels(areas, rotation=45, ha='right')
    ax.legend()

    plt.tight_layout()
    plt.show()

plot_research_areas()

McCarthy's Vision for AI

McCarthy envisioned AI systems capable of human-level reasoning and problem-solving. His concept of "general intelligence" remains a central goal in AI research, inspiring work on artificial general intelligence (AGI).

class GeneralIntelligenceSystem:
    def __init__(self):
        self.knowledge_base = set()
        self.goal_stack = []

    def add_knowledge(self, fact):
        self.knowledge_base.add(fact)

    def set_goal(self, goal):
        self.goal_stack.append(goal)

    def reason(self):
        while self.goal_stack:
            current_goal = self.goal_stack.pop()
            if current_goal in self.knowledge_base:
                print(f"Goal achieved: {current_goal}")
            else:
                self.decompose_goal(current_goal)

    def decompose_goal(self, goal):
        # Simplified goal decomposition
        subgoals = [f"sub_goal_{i}" for i in range(3)]
        self.goal_stack.extend(subgoals)
        print(f"Decomposed goal '{goal}' into: {subgoals}")

# Example usage
agi = GeneralIntelligenceSystem()
agi.add_knowledge("sub_goal_1")
agi.set_goal("solve_complex_problem")
agi.reason()

The Ethical Dimensions of AI

McCarthy was also concerned with the ethical implications of AI. He emphasized the importance of developing AI systems that align with human values and can reason about moral issues.

def ethical_decision_making(action, consequences, ethical_principles):
    ethical_score = 0
    for consequence in consequences:
        for principle in ethical_principles:
            if principle.applies_to(consequence):
                ethical_score += principle.evaluate(consequence)
    
    return ethical_score > 0

class EthicalPrinciple:
    def __init__(self, name, evaluation_function):
        self.name = name
        self.evaluate = evaluation_function

    def applies_to(self, consequence):
        # Simplified check
        return True

# Example ethical principles
utilitarianism = EthicalPrinciple("Utilitarianism", lambda c: c['benefit'] - c['harm'])
deontology = EthicalPrinciple("Deontology", lambda c: 1 if c['respects_rights'] else -1)

action = "deploy_ai_system"
consequences = [
    {"benefit": 100, "harm": 20, "respects_rights": True},
    {"benefit": 50, "harm": 10, "respects_rights": False}
]
principles = [utilitarianism, deontology]

if ethical_decision_making(action, consequences, principles):
    print("The action is ethically justified.")
else:
    print("The action is not ethically justified.")

McCarthy's Lasting Impact

John McCarthy's contributions to AI and computer science have shaped the field for decades. His emphasis on formal logic, knowledge representation, and reasoning continues to influence AI research and development.

import networkx as nx
import matplotlib.pyplot as plt

def create_impact_graph():
    G = nx.DiGraph()
    G.add_edge("John McCarthy", "AI Foundation")
    G.add_edge("AI Foundation", "Knowledge Representation")
    G.add_edge("AI Foundation", "Reasoning Systems")
    G.add_edge("AI Foundation", "LISP")
    G.add_edge("Knowledge Representation", "Expert Systems")
    G.add_edge("Knowledge Representation", "Semantic Web")
    G.add_edge("Reasoning Systems", "Automated Planning")
    G.add_edge("Reasoning Systems", "Logic Programming")
    G.add_edge("LISP", "Functional Programming")
    G.add_edge("LISP", "AI Programming")

    pos = nx.spring_layout(G)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=3000, font_size=8, font_weight='bold')
    plt.title("John McCarthy's Impact on AI and Computer Science")
    plt.axis('off')
    plt.tight_layout()
    plt.show()

create_impact_graph()

More in AI applications and systems

  1. Kernel Trick! Transforming Data for Non-Linear Classification11 min

    The kernel trick is a powerful technique in machine learning that allows linear classifiers to operate in high-dimensional feature spaces without explicitly...

  2. Introducing Foundation Agents The Next Frontier in AI Decision-Making9 min

    Foundation Agents are an emerging paradigm in AI that combines large language models (LLMs) with planning and decision-making capabilities. They aim to...

  3. Knowledge Graph Enhanced Language Agents for Relevant Recommendations10 min

    Knowledge graphs serve as the backbone of KGLA systems, representing entities and relationships in a structured format. We'll implement a basic knowledge...

  4. Instance-wise LoRA (iLoRA) for Sequential Recommendation9 min

    iLoRA is a novel fine-tuning framework designed to address the challenges of individual variability in user behaviors within sequential recommendation...

  5. Pretrained Hybrids vs Neural Architecture Search for Long Range Tasks10 min

    Pretrained Hybrids with MAD Skills (Mix-And-Distribute) and Neural Architecture Search (NAS) are two approaches for designing efficient neural network...

  6. Hopfield Network for Handwritten Digit Reconstruction8 min

    A Hopfield Network is a recurrent artificial neural network with binary threshold nodes and symmetric weights between nodes. It functions as a...