2017-12-03 3 views
1

私は非常にプロローグの新人です。 SWI-prologでswiplを使用しています。Prolog:文字列の最初と最後の文字が左右の角かっこ( '{'& '}')であることを確認する

私は、文字列が波線左ブラケット(で始まるかどうかを確認したい「{」)と右の波線ブラケットで終わる(「}」}

私がオンライン読んでいるいくつかのanswersは、プログラムに私をリードしてきました

start_left_squiggle([Letter|_]):- 
    Letter = '{'. 

。文字列は左波線ブラケットで始まるかどうかを確認するために私の知識ベースに次のしかし、私はこの関数を実行したとき、私はそれがtrueを返すことを期待するとき、私は、偽得る。

?- start_left_squiggle('{hello'). 
false. 

また、answersは、最後の文字が括弧で囲まれているかどうかをチェックするのに正しいと思われます。

last_char(str, X):- 
    name(S, N), 
    reverse(N, [F|_]), 
    name(X, [F]). 

end_right_squiggle(Werd):- 
    last_char(Werd, Last), 
    Last = '}'. 

また、関数を実行しているときに、関数がtrueを返すと期待したときに、再びfalseになります。あなたがする必要がある

?- end_right_squiggle('hello}'). 
false. 
+0

' 'こんにちは}' あなたはfalseを取得する必要がありますので、'ここにあなたが初めと終わりに2波括弧を持っていません。 –

+0

@LuaiGhunim私は2つの機能を別々にテストしています。最初の関数は、文字列が '{'で始まる場合はtrueを返し、2番目の関数は文字列が '}'で終わる場合はtrueを返す必要があります。文字列の終わりは、最初の関数とは無関係で、文字列の始まりは2番目の関数とは無関係です。 – Jacob

+0

簡単な方法は、文字列をリストに変換し、さらに操作を実行することです。 –

答えて

1

まず最初は、このような文字のリストの中に原子を破るためにある:

start_with_left(H):- 
    atom_chars(H,X), %here x is a list 
    X = [L|_], %get the head of the list which is frist element an compare 
    L == '{'. 

あなたに原子を変換した後​​のRIGH側をチェックするために再帰的な定義を使用することができます文字のリストとリストの長さが1の場合は、それを括弧と比較してください。最後の要素が同じ場合はtrue、それ以外の場合はFalseとなります。

右はこのようなものです、それは同じだが、我々が再帰を使用する必要がありますので、我々は最後の要素を必要とする:

start_with_right(H):- 
    atom_chars(H,X), %here x is a list 
    length(X,Y), 
    check_at_end(X,Y). 

check_at_end([H|_],1):- 
    H == '}'. 

check_at_end([_|T],Y):- 
    NewY is Y -1, 
    check_at_end(T,NewY). 

を。

+0

行 'H == '}'、!!'とは何ですか? – Jacob

+0

あなたはそれを削除することができます、それはまだ動作します、それはカットと呼ばれ、私はコメントでそれを説明することはできません。 –

2

使用sub_atom(Atom, Before, Length, After, Subatom)そうのような:

?- sub_atom('{abc}',0,1,_,C). 
C = '{'. 

?- sub_atom('{abc}',_,1,0,C). 
C = '}'. 

それともテスト:

?- sub_atom('{abc}',0,1,_,'{'). 
true. 

?- sub_atom('{abc}',_,1,0,'}'). 
true. 
関連する問題