最初,我的想法与@Boris 和@mat 相同。但是在思考了一会儿这个问题之后,我想到了另一种可能的任务解释。但是,请记住,我不熟悉您的课程材料,因此这是高度推测性的。话虽如此,也许任务描述要求编写一个谓词,如果上述属性成立,则评估为真,否则为假。像这样的谓词可以定义为:
val_either_or_t(X,Y,Z,true) :-
( X#=Y ; X#=Z).
val_either_or_t(X,Y,Z,false) :-
X #\= Y,
X #\= Z.
我承认这个名字有点笨拙,但我真的想不出更好的名字。无论如何,它根据我上面描述的任务解释来完成工作:
?- val_either_or_t(X,1,8,T).
T = true,
X = 1 ? ;
T = true,
X = 8 ? ;
T = false,
X in inf..0\/2..7\/9..sup
?- val_either_or_t(X,Y,Z,T).
T = true,
X = Y,
X in inf..sup ? ;
T = true,
X = Z,
X in inf..sup ? ;
T = false,
X#\=Z,
X#\=Y
我想出了这个想法,因为最近我在玩一些我在 Stackoverflow 上找到的具体化谓词,我突然想到这个任务可能针对一个方向,即所描述的属性可以用作此类谓词的条件. 例如,我在条件中使用了很多带有(=)/3的if_/3,但为什么不将它与 val_either_or_t/4 之类的东西一起使用。考虑以下最小示例:
a(condition_was_true).
b(condition_was_false).
somepredicate(X,Y) :-
if_(val_either_or_t(X,1,8),a(Y),b(Y)).
使用相应的查询:
?- somepredicate(X,Y).
X = 1,
Y = condition_was_true ? ;
X = 8,
Y = condition_was_true ? ;
Y = condition_was_false,
X in inf..0\/2..7\/9..sup
这个例子当然不是很有意义,只是为了说明如何使用给定属性的具体化。此外,我正在使用原子true
并具体化false
与if_/3一起使用它们的真实值。但是,您也可以使用1
and0
来具体化真值,例如 @mat 的示例。只需将 val_either_or_t/4 定义中的第 4 个参数分别替换为1
和0
。此外,您可能会发现@repeat 在评论中提出的这个想法的改进也很有趣。