Я пытаюсь написать предикат, чтобы найти глубину вложенности в термин пролога. например: для атома или переменной глубина равна нулю. для f(a,b,1,2) глубина равна 1. для f(a,b(7,a),1,2) глубина равна 2 и т. д. вот что у меня есть до сих пор.
% base cases.
get_depth(Term,0):-
non_compound(Term),!.
get_depth(Term,1):-
Term =.. [_|T],
all_basic(T),!. % no compound terms in list.
get_depth(Term,Depth):-
% this is where I need help.
% helper prdeicates
all_basic([T]):-
non_compound(T),!.
all_basic([H|T]):-
non_compound(H),
all_basic(T).
% term is non compound, either atomic or non instantiated variable.
non_compound(Term):-
atomic(Term),!;
var(Term).
max(X,Y,X):-
X >= Y,!.
max(_,Y,Y).
?- term_string(a(b(C,D),e(F),g),String). String = "a(b(_10232,_10234),e(_10238),g)"
Другими словами, не рассматривайте ввод как определенные типы терминов Пролога, а вместо этого последовательность символов. - person Guy Coder   schedule 26.11.20201+1
, например, я бы сказал 1, поскольку это компактная форма+(1, 1)
. - person Willem Van Onsem   schedule 26.11.2020a()
? - person Willem Van Onsem   schedule 26.11.20201+1
? Какова глубинаa()
? Также, если кто-то преобразует список в точечную нотацию, например.?- write_term([a,b,c], [dotlists(true)]). .(a,.(b,.(c,[]))) true.
Итак, следует ли преобразовывать входные данные в AST перед обработкой? - person Guy Coder   schedule 26.11.2020not use any specific prolog built in
с течением времени. - person Guy Coder   schedule 26.11.2020