«Общее программирование» в Прологе - PullRequest
2 голосов
/ 21 сентября 2019

Насколько я знаю, в Прологе нет встроенных механизмов для общего программирования .Можно смоделировать обобщенные элементы, используя унификацию, но для этого требуется проверка типов во время выполнения:

:- initialization(main).
:- set_prolog_flag(double_quotes, chars).

% this is a "generic" predicate, where A and B have the same type
add(A,B,C) :-
    generic_types([A:Type,B:Type]),
    (Type = number,
    C is A + B;Type=var,C = A+B).

main :-
    add(A,B,C),
    add(3,4,D),
    writeln(C),
    writeln(D).

generic_types([]).
generic_types([A:B|C]) :-
    member(B,[var,nonvar,float,rational,number,atom,atomic,compound,callable,ground,acyclic_term]),
    call(B,A),
    generic_types(C).
has_type(Type,A) :-
    call(Type,A).

Можно ли написать «универсальные» предикаты без проверки типа каждой переменной во время выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...