Witam,
w jaki sposób mogę sprawdzić w predykacie, czy pod daną zmienną znajduje się lista, a nie liczba?
Macie jakieś pomysły?
Pozdrawiam
0
1
14 ?- is_l([5]).
true.
15 ?- is_l([]).
true.
16 ?- is_l(3).
false.
17 ?- compound([5]).
true.
18 ?- compound([]).
false.
19 ?- compound(2).
false.
20 ?- is_list([5]).
true.
21 ?- is_list([]).
true.
22 ?- is_list(2).
false.
compound i is_list to fx z biblioteki standardowej.
is_l to banalny predykat, równoważny is_list:
is_l([_|_]) :- !.
is_l([]) :- !.
% compound/1 zachowuje się inaczej ([] nie jest listą).
% jeśli chcesz takiego zachowania, wyrzuć powyższą linijkę.
is_l(_) :- !, fail.
Różnią się traktowaniem pustej listy: compound([]) == fail, is_l([]) == is_list([]) == true.
Edit: jest jednak drobna różnica między is_l i is_list - cytując dokumentację is_list, The implementation fails safely if Term represents a cyclic list.