Не все реализации Prolog, кажется, ведут себя так, как SWI-Prolog, когда индекс является переменной. Его поведение может быть расширением стандарта.
Вот что делает GNU Prolog 1.4.5:
| ?- arg(Index,s(a,b,c,d),V).
uncaught exception: error(instantiation_error,arg/3)
| ?- arg(Index,regs(a,b,c),c).
uncaught exception: error(instantiation_error,arg/3)
Так что вам придется самостоятельно возвращаться к действительным индексам. Вы можете использовать functor/3
, чтобы узнать, сколько существует аргументов:
| ?- Term = regs(a,b,c), functor(Term, _Functor, Arity).
Arity = 3
Term = regs(a,b,c)
yes
И многие прологи (включая GNU Prolog) имеют предикат between/3
для перечисления целых чисел в диапазоне:
| ?- between(1, 4, N).
N = 1 ? ;
N = 2 ? ;
N = 3 ? ;
N = 4
(1 ms) yes
Итак, в целом вы можете:
| ?- Term = regs(a,b,c), functor(Term, _Functor, Arity), between(1, Arity, Index), arg(Index, Term, Value).
Arity = 3
Index = 1
Term = regs(a,b,c)
Value = a ? ;
Arity = 3
Index = 2
Term = regs(a,b,c)
Value = b ? ;
Arity = 3
Index = 3
Term = regs(a,b,c)
Value = c
yes
person
Isabelle Newbie
schedule
11.05.2020