В правиле дизъюнкции есть ошибка. Далее, правило перестановки является структурным правилом:
G, A, B, D |- C
---------------
G, B, A, D |- C
И вы должны закодировать его, чтобы оно не зацикливалось. Но сейчас это точно может произойти. Есть простой трюк, может быть, вы хотели его реализовать, только поменять местами неатомы.
Вот исправленная версия:
:- use_module(library(basic/lists)).
sc([neg(A)|L],R) :- !, sc(L,[A|R]).
sc(L,[neg(A)|R]) :- !, sc([A|L],R).
sc(L,[or(A,B)|R]) :- !, sc(L,[A,B|R]).
sc([or(A,B)|L],R) :- !, sc([A|L],R), sc([B|L],R).
sc([A|L],R) :- atom(A), select(B,L,H), compound(B), !, sc([B,A|H],R).
sc(L,[A|R]) :- atom(A), select(B,R,H), compound(B), !, sc(L,[B,A|H]).
sc(L,R) :- member(A,L), member(A,R), !.
И вот несколько прогонов:
Jekejeke Prolog 3, Runtime Library 1.3.5
(c) 1985-2019, XLOG Technologies GmbH, Switzerland
?- sc([],[neg(or(neg(p),neg(neg(p))))]).
No
?- sc([],[or(neg(p),neg(neg(p)))]).
Yes
Замечания: я переместил правило идентификации до конца, поэтому оно будет только ударить атомы. Я поместил разрезы, что оправдано некоторыми леммами обращения для классической логики. Может не работать для других логик или когда возникают неосновательные проблемы.
Иметь обширный API для пользователей и отключать все другие вызовы при загрузке (например, операторы импорта). Кроме того, удалите все, что связано с вводом-выводом файлов.
(Вы можете выполнить несколько проходов, чтобы ничего не пропустить.)
Using PyPy you can create a python sandbox. The sandbox is a separate and supposedly secure python environment where you can execute their scripts. More info here
http://codespeak.net/pypy/dist/pypy/doc/sandbox.html
"In theory it's impossible to do anything bad or read a random file on the machine from this prompt."
"This is safe to do even if script.py comes from some random untrusted source, e.g. if it is done by an HTTP server."
I am in no way associated with this site and I'm only linking it because it tries to achieve what you are getting after: jailing of python. The site is code pad.
According to the about page it is ran under geordi and traps all sys calls with ptrace. In addition to be chroot'ed they are on a virtual machine with firewalls in place to disallow outbound connections.
Consider it a starting point but I do have to chime in on the whole danger thing. Gotta CYA myself. :)
Наряду с другими мерами предосторожности, вы также можете включить обзор кода человеком. Предполагая, что часть опыта рассматривает решения других участников, и каждый является разработчиком Python, не позволяйте активировать новый код, пока за него не проголосует определенное количество участников. Ваши пользователи не собираются утверждать вредоносный код.
Yes.
Allow them to script their client, not your server.
PyPy, вероятно, является приличной ставкой на стороне сервера, как и предлагалось, но я хотел бы рассмотреть вопрос о том, чтобы ваш бэкэнд Python предоставлял хорошо определенные API и форматы данных, и чтобы пользователи реализовывали AI и логику в Javascript, чтобы он мог работать в их браузере. Таким образом, взаимодействие будет выглядеть следующим образом: для каждого совпадения / поворота / и т. Д. Передайте данные в браузер в четко определенном формате, предоставьте шаблон javascript, который получает данные и может реализовывать логику, и предоставлять веб-API, которые могут вызываться клиентом (браузер), чтобы принять необходимые действия. Таким образом, вам не нужно беспокоиться о безопасности или мощности сервера.