所以我有这样的事情:
main :-
% Check whether B,C,D is equal to A
... ,
% Relevant code:
(
(B==A -> write('B is the same as A.'));
(C==A -> write('C is the same as A.'));
(D==A -> write('D is the same as A.'));
).
有没有什么办法可以缩短这个但仍打印相关信件?可能有100个字母要测试,所以这个当前的方法不是很好。
答案 0 :(得分:1)
如果您没有发现这种差异,请快速注意:当您致电A == B
时,您是否知道绑定到变量A
的值是否为equivalent绑定到变量B
的值。但是当你使用write/1
输出时
'B is the same as A.'
,您只是输出由该字母串表示的原子文字。作为原子的一部分的字符'A'
与源代码中由A
(无'
)表示的变量绑定的值之间没有任何关系。
所以我不是100%明确你的预期结果,但是这里有两个不同的解决方案,它们展示了使用format谓词系列来输出值和文字:
如果您只想比较两个变量的值,可以使用谓词来执行比较并打印出所需的结果,然后可以在列表的所有成员上使用(forall/2
在这里是合适的因为我们只关心输出):
report_on_equality(A, B) :-
A == B,
format('~w is the same as ~w.~n', [A, B]).
report_on_equality(A, B) :-
A \== B,
format('~w is not the same as ~w.~n', [A, B]).
example_1 :-
Vals = [1,4,6,1,7],
forall( member(V, Vals),
report_on_equality(V, 1)
).
但是在这种情况下没有理由输出变量的值两次,因为如果它们是等价的,它们当然会是相同的值。因此,您可能实际上想要打印以前与值相关联的大写字符。当然,这要求您首先在大写字符和其他一些值之间进行一些配对。为此,我选择使用pairs的简单列表:
report_on_labeled_equality(LabelA-ValA, LabelB-ValB) :-
ValA == ValB,
format('~w is the same as ~w.~n', [LabelA, LabelB]).
report_on_labeled_equality(LabelA-ValA, LabelB-ValB) :-
ValA \== ValB,
format('~w is not the same as ~w.~n', [LabelA, LabelB]).
example_2 :-
Vals = ['B'-1, 'C'-3, 'D'-1, 'E'-4],
forall( member(V, Vals),
report_on_labeled_equality(V, 'A'-1)
).