【问题标题】:Prolog. Combining predicates序言。组合谓词
【发布时间】:2016-11-06 07:44:54
【问题描述】:

我必须创建一个predicate/2,它需要一个“正确”数字列表作为验证,以及一个需要验证的函数。函数中的数字(表示为number(X))必须与验证列表中的数字相同,才能变为“真”。

当列表在库中“硬编码”时,我可以制作两个单独的 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) :- ???? 

【问题讨论】:

  • 不确定...and(number(2),number(4))and(number(2),number(6)) 是要验证的函数示例吗?或者你是什么意思(你能举一些例子吗?)“需要验证的功能”?无论如何...你能显示你的predicate/1吗?
  • 是的,这些是要验证的函数的示例。这是关于命题公式的。如果 "and(number(1),number(2))" 是正确的,那么验证列表必须包含数字 1 和 2。这就是为什么 "number(X) :- member(X, [1,2 ,3,4,5])”的作品。我的问题是定义一个谓词,以便之后我可以输入例如“谓词([1,3,5,7],或(数字(1),数字(2)))。它会检查 1 和 2 是否是列表的一部分。

标签: prolog


【解决方案1】:

你可以使用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.

【讨论】:

  • 我不确定我是否理解。这如何检查公式是否是我的验证列表的成员?
  • 再次检查我的答案。
【解决方案2】:

另一种解决方案可能是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多