bugfix> prolog > 投稿

フローモデル(i、o)を使用したPROLOG述語f(list、integer)について考えてみます。

f([],0).
f([H|T],S):-
    f(T,S1),
    S1 is S-H.

評価の結果をf([1,2,3,4,5,6,7,8]、S)?答えを正当化してください。

「引数が十分にインスタンス化されていません」というエラーが発生するのを見てきました。これは、Sの値が最後に更新されないためです(リストが空の場合のみ)。これは正当な理由ですか?

回答 1 件
  • I've seen that we get the error "Arguments are not sufficiently instantied" and that is because the value of S is not updated in the end(only when the list is empty). Is this a good justification?

    このコードが失敗することになっている場合は、はい。

    正しい表現は次のとおりです。

    この述語は、バインドされていない変数2番目の位置、上部または再帰的にvai f(T,S1) (どこ S1 新鮮であるため、バインドされていません)。

    次に、算術評価

    S1 is S-H.

    の右側にバインドされていない変数があります is/2 続行できません(つまり、スローされます)。

    ただし、「有限領域での制約満足」に切り替えると機能することに注意してください。

    ?- use_module(library(clpfd)).
    true.
    
    

    その後、交換 is/2 沿って #=

    f([],0).
    f([H|T],S):-
        f(T,S1),
        S1 #= S-H.
    
    

    動作するプログラムを生成します。

    ?-  f([1,2,3,4,5,6,7,8],S).
    S = 36.
    
    

あなたの答え