2014-11-16 1 views
1

내 프롤로그 프로그램에서 뭔가 정규 표현식이라면 술어 reg/1이 있습니다. 정규식의 시퀀스를 정규 표현식으로 인식하도록하고 싶습니다. 따라서 reg(a_1), reg(a_2), ..., reg(a_n)이 모두 정규식이면 Prolog는 reg(a_1, a_2, ..., a_n) 쿼리에 대해 yes/true로 대답해야합니다. 하지만 어떻게해야할지 모르겠다.functor (프롤로그)에 대한 고정 된 아티

reg([H|T]) :- reg(H), reg(T). 
reg([X]) :- reg(X). 

예를 들어, reg(a), reg(b)를 들어, reg(c)는 지식 기반에서 모두, 경우, 프롤로그가/네 쿼리 reg([a, b]) 또는 reg([b, a, c])에 충실한 응답 :하지만, 내가 무슨 짓을

는 다음과 나는 reg(a, b) 또는 reg(b, a, c)과 같은 것을 물을 수 없다. 즉, 대괄호를 제거 할 수 없다.

답변

3

Prolog에서 다양한 구조의 동일한 구조를 사용하는 것은 매우 드뭅니다. 그들이 사용되었지만 사용할 수 없었던 장소를 보여주기 위해 지시문은 동적, 다중 파일 또는 불연속의 술어를 선언하는 데 사용됩니다. 말하자면, a/2b/5을 동적으로 선언하고 싶습니다. 다음 옵션은 ISO-프롤로그에서 가능합니다 :

:- dynamic(a/2). 
:- dynamic(b/5). 

:- dynamic([a/2,b/5]). % using a list 

:- dynamic((a/2,b/5)). % using an and-sequence 

는 또한 많은 프롤로그 시스템은 dynamic/1 접두사 연산자 선언 한 (고유의 구현 확장으로) 당신이 쓸 수 있도록 :

그러나
:- dynamic a/2. 
:- dynamic b/5. 

:- dynamic [a/2,b/5]. 

:- dynamic a/2, b/5. 

,

:- dynamic(a/2,b/5). % does not work 

귀하의 아이디어와 일치합니다.


실제로 표현을 사용하려면 (=..)/2이 필요합니다. 나는 이것이 많은 잠재적 버그의 원인이라고 말하고 싶다.


들이 setof/3의 구현에 사용되는 바와 같이 일반적으로 사용되는 "변수"인수에 대응하는 구조와 변수 세트의 컴팩트 표현은 어디 떠오르는 경우에만. 변수 목록 Vs 대신에 V 구조가 사용됩니다.

term_varvect(T, V) :- 
    term_variables(T, Vs), 
    catch(V =.. ['.'|Vs], 
      error(representation_error(max_arity), _), 
      Vs = V). 
+0

이것은 숙제, 그래서 사물을 표현하는 방법을 혼자 결정할 수 없습니다 : 당신이 오버 플로우 사건을 처리해야 제한된 max_arity

시스템에서
term_varvect(T, V) :- term_variables(T, Vs), V =.. ['.'|Vs]. % some use v instead of '.' 

. 사실 그것은 제가 말한 것과는 조금 다릅니다. 내 프로그램은 정규 표현식으로 'is_regexp (X) : - 원자 (X).'인 원자 적 모든 것을 인식해야한다 .'; 임의의 순서에 대해'is_regexp (seq (a, b, 42, qwe)) '와 같은 질의에 대해 yes로 대답해야합니다. 그래서 제 교수가 결코 그것에 대해 말하지 않더라도'(= ..)/2'와 같은 것을 사용해야한다고 생각합니다. 아니면이 경우에는 다른가요? – Matteo

+0

작전, 내가 틀렸다. 그들은 그것에 대해 말하고 그것을 univ라고 불렀습니다. – Matteo