2010-06-03 2 views
9

프롤로그의 파이프 연산자는 하나 이상의 원자 머리와 꼬리 목록을 반환합니다. 한 번의 매치에서SWI-Prolog에서 [a | b | c]는 무엇을 평가하나요?

?- [a,b,c] = [a,b|[c]]. 
true. 

중첩 여러 파이프이 유사한 수행 할 수 있습니다

?- [a,b,c] = [a|[b|[c]]]. 
true. 

무엇 b와 c 약 문 [a|b|c] 추론을합니까?

편집

지금까지 내가 추론 할 수있는 모든은 다음과 같습니다

?- [a,b,c] = [a|b|c]. 
false. 

나는 답을 찾는 것이 아니라이 경계 쓸모없는 질문에 대답 할 수있는 기술에 더 관심이 있어요.

나는 명확하게, 간단한 할당은 내 질문에 대답 프롤로그 너무 익숙하지 않다
EDIT2 ... (b'|'c)로 진행 정확히 무엇

?- R = [a|b|c]. 
R = [a| (b'|'c)]. 

?

+1

나에게 숙제처럼 보입니다. 그렇다면 태그를 붙이십시오. –

+3

나는 프롤로그에 익숙하지 않다.하지만 어째서 평가할 빠른 프로그램을 쓸 수 없는가? – Matchu

+3

사실, 아니, 재미있는 질문은 uni에서 내 학기 시험을 위해 공부하는 동안 발견 : https://secure.csse.uwa.edu.au/run/help3242?p=np&a=99 나는 잠시 내 질문은 좋은데, 시험지에 적합합니까? :) – Ambrose

답변

9

나 '때문에 교수님, 제 대답은 여기에 있습니다.
(오, 그리고 이것이 숙제가 아니라는 것을 확인할 수 있습니다. 연습 시험과 관련이 있습니다.)

구문 [a|b|c]은 실제로 표준 Prolog가 아닌 것으로 보이며, 일부 구현에서는이를 다르게 해석합니다. (내가 이것을 알았다면 나는 그것을 사용하지 않았을 수도있다.)

일부는이를 [a|[b|c]]으로 해석한다. (내가 의도 한대로.)

하지만 (아마 등) SWI 프롤로그와 함께 : 실제로리스트가 될 것 '|' 오히려 같은 '.'보다 사용하여 구성되는 (b '|' c)

?- [a|b|c] = [a|[b|c]]. 
false. 

합니다.따라서 두 번째 |은 목록을 구성하는 일부분으로 해석되지 않습니다.

이를 확인하려면, 다음 성공 :

 
    ?- X=(b|c), [a|b|c] = [a|X]. 
    X = (b'|'c) . 

'|' 여기에 단지 '.' 같은 용어에 다른 이항 연산자 것으로 보인다.

[a|b|c] 대신 Prolog의 표준은 [a,b|c]을 사용합니다.

(미래에 내가 [a|[b|c]] 관련된 다음 [a,b|c]을 줄 것 같아요. 나는 단지 좀 더 직접적으로 F 번호의 표기 a::b::c에 관련이 있기 때문에 프로그래밍 패러다임에 [a|b|c]을 사용하기로 결정, 그리고 우리는 단지 프롤로그의 작은 엿볼을 보았다 약어로 사용)

+0

아 맞다! 그래서'[a | b | c]는''. (a, (b '|'c))'에 대한 통사적인 설탕입니다!따라서'|'연산자는 꼬리가 엄격히 목록 일 필요가 없다는 점에서'::'과 다르다. 나는 언어가 ** 타입이 아니라는 것을 정확히 의미하는 것을 삼키려고 노력하고있다. – Ambrose

+1

기술적으로''. ''과''|''는 연산자이다. 둘 다 어떤 두 가지 용어에 적용하여 F #/ML에서'::'과는 다른 종류의 쌍을 만들 수 있습니다. 형식 검사기는 머리와 해당 꼬리 쌍에만 사용됩니다. ' '.''은 거의 항상리스트에 사용되며, 구문은 [[t1, t2 | t3]'은''. '(t1,'. '(t2, t3))'의 약어입니다. 't3'가 실제로't4 | t5'라고 쓰면'|'는 약어의 일부가 아니므로''. '(t1,'. '(t2, (t4'| 't5)))'를 얻습니다. – RD1

+1

'[a | b | c]'를'[a | [b | c]'로 해석 한 시스템은 무엇입니까? 표준에 대한 내 대답을 참조하십시오. – false

5

이것은 진술이 아니며 용어이며 아무런 의미가 전혀 없으며 a, b 또는 c입니다. 그것은 단지 부적절한 목록을 구성합니다.

자세히 설명 : [|] 구문은 실제로 .() 연산자에 대한 구문 설탕입니다. 목록은 내부적으로 '.'(a,[])을 통해 생성되지만, 즉시 입력하기가 매우 번거롭기 때문에 [a]을 대신 작성할 수 있습니다. 따라서 . 연산자는 물건과 목록을 취한 다음 더 긴 목록을 작성해야합니다. 그러나 입력이 없기 때문에 아무도 두 개의 원자 또는 다른 쌍에 적용 할 수 없습니다. 결과는 일부 목록 조작이 성공하고 다른 조작이 실패한 구조입니다. 이것은 때로는 유용하지만 (이진 트리를 생각해보십시오), 목록만큼이나 흔하지 않으므로 특별한 읽기 구문이 없습니다.

(거의 같은 리스프에서 cons 연산자 발생;. 당신은 당신이 리스프에 대한 더 많은 결과를 얻을 책임이 있습니다,하지만 원칙은 동일하다 "부적절한 목록을"구글 경우)

+0

감사합니다. ''| ''로 질문의 두 번째 편집에서 포인터를 줄 수있는 기회가 있습니까? – Ambrose

+0

예, SWI Prolog (및 기타)에서 두 번째 '|' '.'로 해석되지 않습니다. – RD1

5

ISO-Prolog에서 [a|b|c]은 유효하지 않은 구문입니다. 그리고 그 동안에도 SWI 내에서. 이전 버전을 사용하신 것 같습니다. 일부 Prolog 시스템은이 용어에 약간의 해석을 내 렸습니다. 슬프 도다, 그들은 모두 그 용어를 어떻게 해석했는지 매우 정확하게 다른 점이있다. 일부는 [(a'|'b)|c] 또는 [a|(b'|'c)] 또는 [a|(b;c)] ... 글쎄, 당신이 그것을 얻을.

이와 관련된 것은 삽입 연산자 ('|')/2과 같은 막대의 사용과 관련됩니다.

ISO/IEC 13211-1:1995/Cor.2:2012, Technical Corrigendum 2, 2012-02-15로 게시 됨. 중첩 연산자로 bar |의 사용이 정확하게 정의되었습니다. 그 전에는 |을 인용해야했습니다. 여기 is its draft.

이제 '|'는 중위 연산자 만 [a|b|c] 달리 모호한 경우 잘못된 구문이 계속 이러한 방식으로 상기 우선 순위 (1000)으로 정의되지만 DCGS위한 | CHR의 사용과는 유효 할 수있다.

시도해보고 구문을 익히려면 writeq/1write_canonical/1을 사용하는 것이 가장 좋습니다.

ISO-Prolog의 가장 일반적인 구문은 GNU Prolog입니다.