在 Prolog 中获取术语参数的索引
Get index of a Term's argument in Prolog
我需要在 Prolog 中获取术语参数的索引。谓词 arg/3 似乎与我需要的相反:
arg(Index, Term, Value).
如果 Index 是一个变量,arg/3
会失败,因此不可能获得给定值和项的索引。你们知道实现此目的的任何其他方法吗(我不能使用外部库)?
预期行为的一个例子是:
?- arg_(Index, regs(a,b,c), c).
Index = 3
当索引是一个变量时,并不是所有的 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
许多 Prolog(包括 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
我需要在 Prolog 中获取术语参数的索引。谓词 arg/3 似乎与我需要的相反:
arg(Index, Term, Value).
如果 Index 是一个变量,arg/3
会失败,因此不可能获得给定值和项的索引。你们知道实现此目的的任何其他方法吗(我不能使用外部库)?
预期行为的一个例子是:
?- arg_(Index, regs(a,b,c), c).
Index = 3
当索引是一个变量时,并不是所有的 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
许多 Prolog(包括 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