如何缩短根据条件打印的谓词

时间:2015-03-09 18:51:54

标签: prolog

所以我有这样的事情:

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个字母要测试,所以这个当前的方法不是很好。

1 个答案:

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