Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
formula(X1, X2, X3, X4, X5, X6, Sign1, Sign2, Sign3, Sign4, Sign5, Result):-
operacia(X1, X2, Sign1, PartialResult1),
Как пример использования — мое решение Greater Than SudokuСудоку — неинтересный пример. Эта задача слишком легко решается на любом языке. Если головоломки любопытны, то мне было бы гораздо интереснее увидеть декларативное решение некоторых других задач (за приемлемое время). Например, Какуро или Забор. Для них разновидности полного перебора очень плохо работают.
Да и для решения обычного Sudoku, как учит нас Питер Норвиг norvig.com/sudoku.html, надо реализовать constraint propagation и поиск.Пара умных терминов и все выглядит уже по-научному. Не знаю насчет Норвига, но простейшая рекурсия с судоку работает на ура.
Greater Than Sudoku — это не обычное Sudoku, а совсем другая головоломка.
Для Какуро вот решения от Hakan Kjellerstrand
server(Port) :-
tcp_socket(Socket),
tcp_bind(Socket, Port),
tcp_listen(Socket, 5),
tcp_open_socket(Socket, In, _Out),
add_stream_to_pool(In, accept(Socket)),
stream_pool_main_loop.
accept(Socket) :-
tcp_accept(Socket, Slave, Peer),
tcp_open_socket(Slave, In, Out),
add_stream_to_pool(In, client(In, Out, Peer)).
client(In, Out, _Peer) :-
read_line_to_codes(In, Command),
close(In),
format(Out, 'Please to meet you: ~s~n', [Command]),
close(Out),
delete_stream_from_pool(In).
не поддерживает логического not().
Это не логическое not.
In Planner, negation as failure could be implemented as follows:
if (not (goal p)), then (assert ¬p)
which says that if an exhaustive search to prove p fails, then assert ¬p.[1] Note that the above example uses true mathematical negation, which cannot be expressed in Prolog.
Negation as failure (то есть not) может быть написан на Planner-е так: if (not (goal p)), then (assert ¬p), что означает: если не удалось доказать истинность p, тогда говорим что отрицание от p истинно (под отрицанием здесь понимается инвертирование булевой переменной). Обратите внимание, что описанный выше пример использует классическое математическое отрицание (то есть инвертирование булевой переменной), которое невозможно описать на прологе.
The logical status of negation as failure was unresolved until Keith Clark [1978] showed that, under certain natural conditions, it is a correct (and sometimes complete) implementation of classical negation with respect to the completion of the program.
Статус negation as failure (то есть not) был непонятен до тех пор, пока Кейф Кларк в 1978 не доказал, что not это правильная реализация классического отрицания.
Всё, что можно решить на %programming_language%, можно решить ничуть не труднее на любом другом яву.
ничуть не труднее
есть ли комерческий/промышленный софт написанный на прологе?
Пролог – декларативный язык, способный решать любые ребусы и доказывать теоремы