2016-05-09 8 views

答えて

4

(?このような問題を発明誰が)

:- use_module(library(clpfd)). 

last_two(Xs, S) :- 
    phrase((..., [X,Y]), Xs), 
    S #= X+Y. % or S is X+Y. 

... --> [] | [_], ... . 
:それはこれを返すためにどのように見えるか

last_two([],false). 
last_two([H|[]],H). 
last_two([_|T], P) :- last_two(T,P). 

: 私は今だすべては、リストの最後の項目を返す関数であります

はるかに高速なソリューションがありますが、DCGを理解した後は、上記のことが最も理解しやすいと思います。

falseとデフォルト値を使用することをお勧めしました。私はこれに少し懐疑的です。空リストの理由はなぜfalseですか?しかし、効果的に0は、単一要素のリストですか? Prologでは、単に失敗する可能性があります。 SWI-Prologの中

:- use_module(library(clpfd)). 

last_two(Xs, S) :- 
    last_two(Xs, 0, 0, S). 

last_two([], A, B, S) :- 
    S #= A+B. 
last_two([B|Bs], _, A, S) :- 
    last_two(Bs, A, B, S). 
+0

ため

last_two(Xs, S) :- append(_, [U,V], Xs), plus(U,V,S). 

を書くことができます。 'false'ではなく' 0'があります。私は[http://swish.swi-prolog.org/](http://swish.swi-prolog.org/)でコードを実行していますが、正しく動作しません。エラーを返します。他の解決策はありますか? –

+2

@ P.Barbra:上記はSICStusとSWIで実行されます。 – false

+0

ありがとうございます。インポート(use_module)せずにこれを解決する方法はありますか?本当に申し訳ありませんが、もし私が私の試験でこれを使用したら、私の先生は幸せにならないでしょう。私はおそらくFを持っていただろう。 –

1

、[はい、あなたが正しいインスタンス

?- last_two([_,U,3],10). 
U = 7 
関連する問題