Advertisement
Guest User

Untitled

a guest
Mar 10th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 4.21 KB | None | 0 0
  1. (defun simple-equal (x y)
  2.   (if (or (atom x) (atom y)) ;atom = boolean
  3.     (eql x y)
  4.     (and (simple-equal (car x) (car y)) ;car primero en la lista.
  5.          (simple-equal (cdr x) (cdr y))))) ; cdr el resto de la lista
  6.  
  7. (defun pat-match (pattern input)
  8.   (if (variable-p pattern)
  9.     t
  10.     (if (or (atom pattern ) (atom input))
  11.       (eql pattern input)
  12.       (and (pat-match (car pattern) (car input)) ;car primero en la lista.
  13.            (pat-match (cdr pattern) (cdr input)))))) ; cdr el resto de la lista
  14.  
  15. (defun variable-p (x)
  16.   (and (symbolp x) (equal (char (symbol-name x) 0) #\?))) ;symbolp boolean para simbolos.
  17.  
  18. (defconstant fail nil)
  19. (defconstant no-bindings '((t . t))) ;true true
  20.  
  21. (defun get-binding (var bindings)
  22.   (assoc var bindings)) ;assoc takes a key and an alist and returns the first cons cell whose CAR matches the key or NIL if no match is found.
  23.  
  24. (defun binding-val (binding)
  25.   (cdr binding))
  26.  
  27. (defun lookup (var bindings)
  28.   (binding-val (get-binding var bindings)))
  29.  
  30. (defun extend-bindings (var val bindings)
  31.   (cons (cons var val) bindings))
  32.  
  33. (defun pat-match (pattern input &optional (bindings no-bindings))
  34.   (cond ((eq bindings fail) fail)
  35.         ((variable-p pattern)
  36.          (match-variable pattern input bindings))
  37.         ((eql pattern input) bindings)
  38.         ((and (consp pattern) (consp input))
  39.          (pat-match (cdr pattern) (cdr input)
  40.                     (pat-match (car pattern) (car input) bindings)))
  41.         (t fail)))
  42.  
  43. (defun match-variable (var input bindings)
  44.   (let ((binding (get-binding var bindings)))
  45.     (cond ((not binding) (extend-bindings var input bindings))
  46.           ((equal input (binding-val binding)) bindings)
  47.           (t fail))))
  48.  
  49.  
  50. (defun extend-bindings (var val bindings)
  51.   (cons (cons var val)
  52.         (if (eq bindings no-bindings)
  53.           nil
  54.           bindings)))
  55.  
  56. (defun pat-match (pattern input &optional (bindings no-bindings))
  57.   (cond ((eq bindings fail) fail)
  58.         ((variable-p pattern)
  59.          (match-variable pattern input bindings))
  60.         ((eql pattern input) bindings)
  61.         ((segment-pattern-p pattern)
  62.          (segment-match pattern input bindings))
  63.         ((and (consp pattern) (consp input))
  64.          (pat-match (cdr pattern) (cdr input)
  65.                     (pat-match (car pattern) (car input) bindings)))
  66.         (t fail)))
  67.  
  68. (defun segment-pattern-p (pattern)
  69.   (and (consp pattern)
  70.        (starts-with (car pattern) '?*)))
  71.  
  72. (defun starts-with (lst symb)
  73.   (if (consp lst)
  74.     (eql (car lst) symb)
  75.     (eql lst symb)))
  76.  
  77. (defun segment-match (pattern input bindings &optional (start 0))
  78.   (let ((var (cadr (car pattern)))
  79.         (pat (cdr pattern)))
  80.     (if (null pat)
  81.       (match-variable var input bindings)
  82.       (let ((pos (position (car pat) input :start start :test #'equal)))
  83.         (if (null pos)
  84.           fail
  85.           (let ((b2 (pat-match pat (subseq input pos) bindings)))
  86.             (if (eq b2 fail)
  87.               (segment-match pattern input bindings (1+ pos))
  88.               (match-variable var (subseq input 0 pos) b2))))))))
  89.  
  90. (defun segment-match (pattern input bindings &optional (start 0))
  91.   (let ((var (cadr (car pattern)))
  92.         (pat (cdr pattern)))
  93.     (if (null pat)
  94.       (match-variable var input bindings)
  95.       (let ((pos (position (car pat) input :start start :test #'equal)))
  96.         (if (null pos)
  97.           fail
  98.           (let ((b2 (pat-match
  99.                       pat (subseq input pos)
  100.                       (match-variable var (subseq input 0 pos)
  101.                                       bindings))))
  102.             (if (eq b2 fail)
  103.               (segment-match pattern input bindings (1+ pos))
  104.               b2)))))))
  105.  
  106. (defun rule-pattern (rule) (car rule))
  107. (defun rule-responses (rule) (cdr rule))
  108. (defparameter *s* (open "/Users/naiem/Documents/PROLOG/ELIZA/archivo.txt"))
  109. (defparameter *eliza-rules*
  110. (read *s*)
  111. )
  112.  
  113. (defun eliza ()
  114.   (loop
  115.     (print 'eliza>)
  116.     (write (flattern (use-eliza-rule (read))) :pretty t)))
  117.  
  118. (defun use-eliza-rule (input)
  119.   (some #'(lambda (rule)
  120.             (let ((result (pat-match (rule-pattern rule) input)))
  121.               (if (not (eq result fail))
  122.                 (sublis (switch-viewpoint result)
  123.                         (random-elt (rule-responses rule))))))
  124.         *eliza-rules*))
  125. (defun switch-viewpoint (words)
  126.   (sublis '((yo . tu) (tu . yo) (yo . tu) (soy . eres))
  127.           words))
  128.  
  129. (defun random-elt (lst)
  130.   (elt lst (random (length lst))))
  131.  
  132. (defun mappend (fn lst)
  133.   (apply #'append (mapcar fn lst)))
  134.  
  135. (defun flattern (lst)
  136.   (mappend #'mklist lst))
  137.  
  138. (defun mklist (x)
  139.   (if (listp x)
  140.     x
  141.     (list x)))
  142.  
  143. (eliza)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement