PROLOG使用arg / 3功能

时间:2017-11-11 21:03:56

标签: prolog

我必须在prolog中编写 project / 3 谓词,当第三个参数是包含第N个参数的列表时,返回 true 第一个列表元素。如果一个术语少于第N个参数,则必须忽略它。 我需要使用默认谓词,如functor,arg或univ(= ..)。

一些例子:

?-project([foo(bar, baz), 40 + 2, sin(x), log(16, 2)], 2, [baz, 2, 3]).
  true

?-project([3 * sin(x), 40 + 2, cos(x), 42], 2, L2).
  L2 = [sin(x), 2]

我写的代码:

project([], _, []):- !.
project([X | Xs], N, [Z | Zs]):-arg(N, X, Z), project(Xs, N, Zs).

如果我尝试,例如:

?- project([40 + 2, 30 - 1], 2, X).
X = [2, 1].

结果很好。我不明白如何添加"如果一个术语少于第N个参数,那么必须忽略它并且#34; 代码中的一部分。

所有

1 个答案:

答案 0 :(得分:1)

在你当前的尝试中,如果N大于该术语的arity那么 arg(N, X, Z)会失败,因此project/3也会失败:

?- project([foo(bar, baz), 40 + 2, sin(x), log(16, 2)], 2, L).
false.

因此,您需要处理因arg(N, X, Z)而调用N>arity of X失败并忽略术语X的情况:

project([], _, []):- !.
project([X | Xs], N, L):- 
                ( 
                  arg(N, X, Z) 
                     -> L =[Z|Zs], project(Xs, N, Zs)
                  ;
                  project(Xs, N, L)
                ).

现在,如果你尝试:

?- project([foo(bar, baz), 40 + 2, sin(x), log(16, 2)], 2, L).
L = [baz, 2, 2].

您可以看到它成功返回正确答案!!