序言。结合谓词

时间:2016-11-05 21:01:45

标签: prolog

我必须制作一个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) :- ???? 

2 个答案:

答案 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).