1

R = (2*X + Y)^N指数演算子を使用せずに計算する再帰関数をプロローグに書き込もうとしています。if-else ステートメントを使用して再帰関数を作成しましたが、エラーが発生しました: ) or operator expected. 構文は正しいように見えますが、何かが欠けているに違いありません。コードは以下です。

expbar(R, X, Y, N) :-
    (X =:= Y =:= N =:= 0 -> 
        write("No two variables can equal 0 at the same time.");
        (N =:= 0 ->
            R is 2 * X + Y;
            R is (2 * X + Y) * expbar(R, X, Y, N-1)
        )
    ).
4

3 に答える 3

2

あなたはいつもその表現を使って2*X+Yいます。最初に計算してから、その結果を実際の計算に使用してみませんか?たぶんあなたはここで問題の声明の何かを見逃しましたか?

X、、YおよびNがすべて0の場合を除外するのはなぜですか?N < 0...あなたが?の場合を除外していない間

引数の順序

Prologでは、対応する入力引数のに結果を置くのが一般的です。この規則には例外があり(is)/2、最も一般的な例ですが、中置演算子として記述されています。

エラーシグナリング

適切に処理できない場合のために、Prologには2つのオプションがあります。黙って失敗するか、クリーンエラーを発行します。(3つ目はループです。これは理想的ではありませんが、成功するよりはましです。)現在、テキストを書き出してから成功します。したがって、誰かがあなたのメッセージを読むと想定しています。ただし、プログラムが無人で実行されることが多く、メッセージは無視されます。

あなたの定義を使用して、あなたの定義が答えの質問であることを証明したいとします。

-expbar(42、0、0、0)。

これは、に書き直しX =:= Y =:= N =:= 0た後にSWIで取得するものX =:= 0, Y =:= 0, N =:= 0です。

-expbar(42、0、0、0)。
[78,111,32,116,119,111,32,118,97,114,105,97,98,108,101,115,32,99,97,110,32,101,113,117,97,108,32,48,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46]
本当。

それは言うtrue.!そして、上記のこれらの数字は確かにそのような非常に複雑な計算からのいくつかの進捗メッセージです...したがって、あなたのメッセージを誤解するのは非常に簡単です。一重引用符を使用した方が少し簡単だったでしょう。一重引用符と二重引用符の詳細。しかし、より読みやすいメッセージであっても、それをスキップするのは簡単です。

このような状況を処理する適切な方法は、エラーを発行することです。

    throw(error(Error_term、_More_info))

このようにして、計算は中止され、エラーはトップレベル(またはハンドルが処理する次の場所)によって処理されcatch/3ます。これにより、エラーが誤って解釈される可能性が低くなります。

Error_term、理想的には既存のエラー用語の1つである必要があります。これがISOPrologのエラーの完全なリストです。あなたの場合、それはべき乗evaluation_error(undefined)の定義に似ているかもしれません。

于 2012-04-22T13:46:47.867 に答える
0

expbar は関数ではありません。正しいのは

expbar(R, X, Y, N) :-
(X =:= Y =:= N =:= 0 -> 
    write("No two variables can equal 0 at the same time.");
    (N =:= 0 ->
        R is 2 * X + Y;
        N1 is N - 1,
        expbar(R1, X, Y, N1)
        R is (2 * X + Y) * R1
    )
).
于 2012-04-22T07:00:13.857 に答える
0

初期条件で構文エラーが発生するはずです。joel76の回答に追加:

expbar(R, X, Y, N) :-
    (   ( X =:= 0, Y =:= 0 ; X =:= 0, N =:= 0 ; Y =:= 0, N =:= 0 )
    ->  write("No two variables can equal 0 at the same time.")
    ;   (   N =:= 0
        ->  R is 2 * X + Y
        ;   N1 is N - 1,
            expbar(R1, X, Y, N1),
            R is (2 * X + Y) * R1
        )
    ).
于 2012-04-22T07:35:51.913 に答える