Пролог предельно простая штука, если не пытаться сделать "самый быстрый" и "самый меньше всего жрущий ресурсов", поэтому он и для Спектрума был и даже для БКшки
Вид для печати
Ну не у всех Прологов одни и те же возможности. Имея реализацию Lisp-а было бы естественно реализовать Пролог на Lisp-е.
И такие реализации с ненулевой вероятностью существуют. На uLisp-е uProlog мне не попадался. Хотя для него-то по крайней мере с поддержкой графики( не говорю о распознавании графических образов) не надо париться.
Насчет предельно простая штука не уверен( Не на всяком сделаешь базу знаний и обнаружение неполноты знаний. Там где аксиомы прописаны вместе с фактами и весь фокус-покус в логических выводах наверное да) Конечно какой-нибудь Турбо Пролог от Borland не слишком сложная штука, но так как стандартов на него не существует, тут уж кто во что горазд. Впрочем с Lisp-ом примерно та же ситуация.
- - - Добавлено - - -
опять же как память тратить...понятно для двоичной логики битов достаточно, но только у этих процессоров побитово адресуемой памяти кажись не было, а сдвигами если, то экономия в одном и расточительство в другом. Поэтому и пытались и Lisp, и Prolog на уровне железа поддерживать в 80-е. Как себя нынешние ARM M0,M3, M4 себя с этим ведут пока не вникал.
Ну, вообще говоря реализация Пролога для меня пока - просто туман и маниловщина.
Просто в последнее время я много и успешно работал с PL65 и пользуясь тем,
что в нём есть встроенный ассемблер и нормальная документация полагаю там справится и с битовыми масками и пр. можно.
Беда в том, что современный Лисп и Пролог, просто обязаны использовать расширенную память, а это уже прямая зависимость от HW.
Схем раздачи фреймов памяти - просто тыща. Эмуляторы отрабатывают с трудом и глючно.
Сами схемы не всегда достаточно обоснованы, что ведёт к жуткой путанице в определении причин сбоев и пр.
Ну, просто представьте, что в Интерлиспе/65 нет способа получить ATASCII код буквы.
Что же для этого ассоциативный список, что ли строить? Нет интерфейса к Ассемблерным программам.
Из-за того, что ввод данных с диска - поток атомов, где пробелы игнорируются как разделители, даже через XIO
невозможно по человечески вывести директорию.
Ничто не задокументировано, так как ремарок нет.
Лисп компилятора тоже нет.
Но я всё же пытаюсь сделать что-то весёлое...
zen
Видимо авторы делали не удобный и полезный инструмент для себя, а для каких-то других целей. Или не успели довести до ума.
uLisp распространяется без исходников, но для кучи платформ и есть интерфейс к ассемблерам. К сожалению для 6502 версии нет, так что остается или прикрутить его ассемблер самостоятельно или искать в исходниках, или конвертить из одних исходников в другие.
Совсем экзотика найти или разработать Atari-8 на чипах(по сути эмулировать в железе), поддержанных uLisp, и с учетом имеющихся графических и иных библиотек. uLisp поддерживает SD card interface
Ну а после этого Prolog, написанный на Lisp будет доступен в исходниках.
по прологу есть книга неплохая, называется "the implementation of Prolog"
Сделать пролог на лиспе даётся как лабораторная работа :)
Вот например: http://ds.knu.edu.ua/jspui/bitstream...1/labsbook.pdf (последняя лабораторка в самом конце документа)
Он, конечно, совсем простой, факты и правила записываются списками на лиспе. Но, судя по всему, это должно работать.
Реализацию в студию пожалуйста!
Ну, насчёт реализации -я пессимист.
Всё правильно. Хотели сделать нормальный ЛИСП, но ...
Просто забросили!!!
В доказательство - код из библиотеки LDUMP:
Оба кода рабочие, но в LDUMP нигде не входит TABX.Код:;; Распечатка Форм из "Директории файла" (Properties)
(DEFUN LDUMP (PROPS)
(PROGN (OPEN 1 8 (QUOTE P:)) ; Открыть 1 IOCB на вывод
(PR# 1) ; Перенаправить вывод с терминала на 1 IOCB
(MAPCAR PROPS ; Для каждой формы в директории ...
(LAMBDA (X) ; X - это директория файла
(PROGN (TERPRI) ; Исполнять последовательно ...
(TERPRI) ; CR
(PRIN1 (QUOTE "**** ")) ; Звёздочки без CR
(PRINT X) ; Имя формы + CR
(PPRINT (GETD X))))) ; Печатать определение
(PR# 0) ; Вернуть вывод на Терминал
(CLOSE 1))) ; Закрыть 1 IOCB
;; Установка отступа в Печатуемой строке на N позицию пробелами!!!
(DEFUN TABX (N)
(PROG (COUNT) ; Исполнять последовательно с циклом ...
(SETQ COUNT N) ; Инициализировать обратный счётчик
LOOP ; Метка
(SETQ COUNT (SUB COUNT 1)) ; Декрементировать
(COND ((> COUNT 0) ; Пока не ноль
(PRIN1 (QUOTE " ")) (GO LOOP))) ; Печать пробела и на метку
(RETURN))) ; По исполнении выйти.
В результате, никакой PP печати. Хоть формы-то разделены.
(EDIT при PP пользуется встроеной TAB, которая просто устанавливает позицию в строке терминала, следовательно нет пробелов.
Кроме этого, LDUMP пользуется формой PPRINT в составе EDIT, а значит без загрузки D:EDIT бесполезна.
Пока же я пробую выкорчевать из EDIT PP и заставить её печатать так как надо.
zen
Вообще-то сделал.
Вот результат печати:
А вот файлик с программами. (нужно учесть что в текстовом редакторе формы не напечатать!)Код:(DEFINEQ PP
(LAMBDA NIL
(PPRINT S-EXP 2))
)
(DEFINEQ P
(LAMBDA NIL
(PPRINT (CAR CURR) 2))
)
(DEFINEQ PPRINT
(LAMBDA (X IND)
(PROG (TFLG)
(PPAUX X IND)
(TERPRI)))
)
(DEFINEQ PPAUX
(LAMBDA (X INDTN)
(COND ((ATOM X)
(PRIN2 X) (SETQ TFLG))
((ATOM (CAR X))
((LAMBDA (Y)
(COND (Y (MULTARGS X INDTN (CDR Y)))
((PROGN (PRIN1 LPAR)
(PRIN2 (CAR X))
(PPARGS (CDR X) INDTN)
(PRIN1 RPAR)
(SETQ TFLG))
)))
(ASSOC (CAR X) *FORMATS*)))
(((LAMBDA (IND1)
(PROGN (PRIN1 LPAR)
(SETQ TFLG T)
(PPAUX (CAR X) IND1)
(TABRET INDTN)
(PPARGS (CDR X) IND1)
(PRIN1 RPAR)
(SETQ TFLG)))
(+ INDTN 1))
)))
)
(DEFINEQ MULTARGS
(LAMBDA (X INDTN L)
((LAMBDA (INDTN2)
(PROGN (TABRET INDTN)
(PRIN1 LPAR)
(PRIN2 (CAR X))
(PRIN1 BLANK)
(PPAUX (CAR (CDR X)) INDTN2)
(COND ((CDR (CDR X))
(MAPCAR (CDR (CDR X))
(QUOTE (LAMBDA (Y)
(PROG NIL
(TABRET INDTN2)
(PPAUX Y INDTN2)))))))
(PRIN1 RPAR)
(SETQ TFLG)))
(+ INDTN (CAR L))))
)
(DEFINEQ PPARGS
(LAMBDA (X INDTN)
(PROG NIL
LOOP
(COND ((EQ X)
(RETURN))
((ATOM X)
(PRIN1 (QUOTE " . ")) (PRIN1 X) (RETURN)))
(PRIN1 BLANK)
(PPAUX (CAR X) INDTN)
(SETQ X (CDR X))
(GO LOOP)))
)
(DEFINEQ TABRET
(LAMBDA (N)
(PROG NIL
(COND (TFLG (RETURN))
((TERPRI)
))
(SETQ TFLG T)
(COND ((> N LINE-WIDTH)
(TERPRI) (TABX (SUB N LINE-WIDTH)))
((TABX N)
))))
)
(DEFINEQ *FORMATS*(NIL)
)
(DEFINEQ LPAR(NIL)
)
(DEFINEQ BLANK(NIL)
)
(DEFINEQ RPAR(NIL)
)
(DEFINEQ LINE-WIDTH(NIL)
)
(DEFINEQ TABX
(LAMBDA (N)
(PROG (COUNT)
(SETQ COUNT N)
LOOP
(SETQ COUNT (SUB COUNT 1))
(COND ((> COUNT 0)
(PRIN1 (QUOTE " ")) (GO LOOP)))
(RETURN)))
)
(DEFINEQ LDUMP
(LAMBDA (PROPS)
(PROGN (OPEN 1 8 (QUOTE P:))
(PR# 1)
(MAPCAR PROPS
(LAMBDA (X)
(PROGN (TERPRI)
(PRIN1 (QUOTE "(DEFINEQ "))
(PRIN1 X)
(PPRINT (GETD X))
(PRINT RPAR))))
(PR# 0)
(CLOSE 1)))
)
Вложение 74250
Это не zip, Надо убрать расширение.
zen
Поскольку нативного железа у меня нет, подскажите пожалуйста, в каком эмуляторе это можно запустить?