我必须制作一个predicate/2
,其中列出"正确的"数字作为验证,以及需要验证的功能。函数中的数字(表示为number(X)
)必须与验证列表中的数字相同才能成为" true"。
我可以制作两个单独的predicates/1
,当列表是"硬编码"时,我会给出正确的答案。在图书馆,但我可以为我的神不要把这些结合起来。
到目前为止,我有这个:
number(X) :- member(X, [1,2,3,4,5]).
这给出了正确的结果,例如当我要求and(number(2),number(4))
时,它说是,而and(number(2),number(6))
给不。
但现在我必须做predicate/2
,它将列表作为第一个参数。
任何人都可以帮忙/给出任何暗示吗?
predicate(ValidationList, Function) :- ????
答案 0 :(得分:0)
您可以使用call
谓词:
and(X,Y) :- call(X), call(Y).
or(X,Y) :- call(X); call(Y).
predicate(List, Function) :-
Function =.. [P,X,Y],
call(P, member(X, List), member(Y, List)).
例如:
?- predicate([1,2,3], and(1,3)).
true.
?- predicate([1,2,3], and(1,4)).
false.
?- predicate([1,2,3], or(1,4)).
true.
?- predicate([1,2,3], or(4,5)).
false.
答案 1 :(得分:0)
另一种解决方案可能是
predicate(ValList, and(X, Y)) :-
predicate(ValList, X),
predicate(ValList, Y).
predicate(ValList, or(X, Y)) :-
predicate(ValList, X)
; predicate(ValList, Y).
predicate(ValList, number(X)) :-
member(X, ValList).