kedalaman bersarang suatu istilah

Saya mencoba menulis predikat untuk menemukan kedalaman sarang dalam istilah prolog. misalnya: untuk atom atau variabel kedalamannya nol. untuk f(a,b,1,2) kedalamannya adalah 1. untuk f(a,b(7,a),1,2) kedalamannya adalah 2, dst. inilah yang saya miliki sejauh ini.

% 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).

person Benny Abramovici    schedule 26.11.2020    source sumber
comment
Mengapa tidak menggunakan term_string/2 lalu melacak buka dan tutup kurung? misalnya ?- term_string(a(b(C,D),e(F),g),String). String = "a(b(_10232,_10234),e(_10238),g)" Dengan kata lain, jangan perlakukan input sebagai tipe istilah Prolog tertentu, melainkan sebagai rangkaian karakter.   -  person Guy Coder    schedule 26.11.2020
comment
@GuyCoder: pertanyaannya adalah, berapa kedalaman 1+1 misalnya, saya akan mengatakan 1, karena ini adalah bentuk kompak dari +(1, 1).   -  person Willem Van Onsem    schedule 26.11.2020
comment
@GuyCoder: atau item dengan arity zero, seperti a()?   -  person Willem Van Onsem    schedule 26.11.2020
comment
@WillemVanOnsem Pertanyaan bagus, saya tidak tahu. Itu sebabnya komentar saya mengajukan pertanyaan. Harus melihat apakah OP merespons.   -  person Guy Coder    schedule 26.11.2020
comment
senyawa apa pun yang kedalamannya 1 atau lebih tinggi, bergantung pada tingkat sarangnya, sebaliknya jika atomik atau variabel maka kedalamannya adalah 0.   -  person Benny Abramovici    schedule 26.11.2020
comment
Saya lebih suka tidak menggunakan prolog khusus apa pun yang ada di dalamnya seperti term_string, hanya prolog vanilla biasa.   -  person Benny Abramovici    schedule 26.11.2020
comment
@BennyAbramovici Jadi berapa kedalaman 1+1? Berapa kedalaman a()? Juga jika seseorang mengubah daftar menjadi notasi titik, mis. ?- write_term([a,b,c], [dotlists(true)]). .(a,.(b,.(c,[]))) true. Jadi haruskah seseorang mengubah input menjadi AST sebelum diproses?   -  person Guy Coder    schedule 26.11.2020
comment
Saya memberikan suara yang cermat karena pertanyaannya memerlukan kejelasan lebih lanjut. OP menambahkan lebih banyak ketentuan, mis. not use any specific prolog built in seiring berjalannya waktu.   -  person Guy Coder    schedule 26.11.2020
comment
tidak ada daftar, hanya istilah dalam format:t(a,1,f(12,a),5) dll.   -  person Benny Abramovici    schedule 26.11.2020


Jawaban (1)


depth(Term, D) :-
    Term =.. [_|Args],
    (  Args = []
    -> D = 0
    ;  maplist(depth, Args, Ds),
       max_list(Ds, D1), D is D1 + 1
    ).

Jika Anda tidak ingin maplist dan max_list

depth(Term, D) :-
    Term =.. [_|Args],
    (  Args = []
    -> D = 0
    ;  max_depth(Args, D1), D is D1 + 1
    ).

max_depth([Term], Max) :- depth(Term, Max).
max_depth([T1, T2| Rest], Max) :-
    depth(T1, D1), max_depth([T2 | Rest], M1),
    (D1 > M1 -> Max = D1; Max = M1).
person rajashekar    schedule 26.11.2020
comment
apakah ini mungkin tanpa maplist dan max_list karena spesifik untuk implementasi. - person Benny Abramovici; 26.11.2020
comment
Anda dapat menentukan maplist dan max_list Anda sendiri dengan cukup mudah jika Anda mau. Sebenarnya Anda sebenarnya tidak membutuhkan keduanya, menurut saya menggulirkan foldl Anda sendiri sudah cukup. - person rajashekar; 26.11.2020