我必须在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; 代码中的一部分。
所有
答案 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].
您可以看到它成功返回正确答案!!