2017-12-03 31 views
1

저는 프롤로그를 처음 사용하는 사람이므로 매우 익숙하지 않습니다. SWI-prolog에서 swipl을 사용하고 있습니다. 문자열이 구불 구불 왼쪽 브래킷으로 시작 ('{')과 오른쪽 구불 구불 한 브래킷 (로 끝나는 '}'나는 온라인 읽고 일부 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 = '}'. 

함수를 실행할 때 다시 false가 반환됩니다. 당신이해야 할

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

'안녕하세요} ''여기 당신이 태초과 끝에서 두 중괄호가없는 . –

+0

@LuaiGhunim 두 기능에 대한 테스트를 별도로 수행하고 있습니다. 첫 번째 함수는 문자열이 '{'로 시작하는 경우 true를 반환하고 두 번째 함수는 문자열이 '}'로 끝나면 true를 반환해야합니다. 문자열의 끝은 첫 번째 함수와 관련이 없으며 문자열의 시작은 두 번째 함수와 관련이 없습니다. – 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 == '{'. 

당신은에 원자를 변환 한 후 atom의 맞 측면을 확인하기 위해 재귀 적 정의를 사용할 수 있습니다 문자 목록 및 목록 길이가 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.