【问题标题】:Prolog Mutual recursionProlog 相互递归
【发布时间】:2014-06-19 08:45:10
【问题描述】:

好的,我正在编写一些代码来通过 Prolog 中的相互递归来检查每个值。 到目前为止,这是我的代码:

semestersok(SP) :-
    [Prior|Tail] = SP,
    sem1ok(SP).



%% sem1ok(SP) :- checks semester 1 of SP is ok
sem1ok(SP) :-
    [Sem1|Tail] = SP,
    sem2ok(Tail).

%% sem2ok(SP) :-
sem2ok(SP) :-
    [Sem2|Tail] = SP,
    sem1ok(Tail).

我还没有放入任何与检查有关的代码(有两个关系,因为它必须检查交替值),我遇到了代码循环问题,直到它有一个空列表,然后它失败了并返回错误(否)。由于此代码没有操纵任何代码,我相信它应该像现在一样恢复真实。为什么不是?

【问题讨论】:

    标签: recursion prolog mutual-recursion


    【解决方案1】:

    您需要一些针对空列表的规则。添加这个:

    sem1ok([]).
    sem2ok([]).
    

    另外,如果你这样写代码可能会更直观(因为匹配空列表的规则和匹配非空列表的规则之间的区别更清楚):

    % Rules for sem1ok/1
    sem1ok([]).
    sem1ok([Sem1|Tail]):-
        ok(Sem1), % Something involving Sem1
        sem2ok(Tail).
    
    % Rules for sem2ok/1
    sem2ok([]).
    sem2ok([Sem2|Tail]):-
        ok(Sem2), % Something involving Sem2
        sem1ok(Tail).
    

    【讨论】:

    • 好的,很抱歉听起来很愚蠢,但我应该在哪里添加呢?在所有这些代码之前?
    • 您可以为谓词编写任意数量的规则,通常所有规则都打包在一起。因此,将sem1ok/1sem2ok/1 的规则分别分组。
    • 太棒了,谢谢你,它现在可以工作了:) 它只是在它现在执行后要求一个动作,这很奇怪,但它又回来了
    • 不等,我知道它为什么要这么做。很好,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多