2013-05-25 2 views
2

변수를 나중에 여러 원자에 바인딩하여 나중에 해당 원자 중 하나와 통일 될 수 있도록하고 싶습니다. u는 이러한 개념을보다시피프롤로그에서 변수에 대한 여러 바인딩 옵션

?- X = (apple; pear), X = apple. 
    X = apple. 

    ?- X = (apple; pear), X = apple, X = pear. 
    false. 

    ?- X = (apple; pear; orange), X = (apple; orange). 
    X = (apple; orange). 

    ?- X = (apple; orange), X = (pear; orange). 
    X = orange. 

    ?- X = (apple; orange), X = pear. 
    false. 

유형 계층의 개념에 가까운 :; 직관적으로는 다음과 같이 작동한다 (즉, 가정은 분리 가능한 값이다). 그래서 이런 종류의 일을하기 쉽도록 만든 (메타) 술어가 있는지, 또는 이것을 모델링하기 위해 일종의 데이터 구조를 사용하는 일반적인 방법이 있는지, 그렇지 않으면이 종류를 구축해야하는지 궁금합니다. 술어를 처음부터?

+0

'유형 계층 구조의 개념'은 무엇을 의미합니까? 나는 어떤 비유도 볼 수 없다. – CapelliC

+0

맞습니다.이 필링을 얻기가 어렵습니다. 오렌지, 사과, 배는 유형 appl_pear, appl_oran, pear_oran (대략 apple (사과), 배) 등으로 계층 구조에 입력 할 수 있다는 점에서 계층 구조의 개념에 가깝습니다. 프롤로그 일치가 유형 계층 구조에서 통일로 작용했습니다. –

답변

2

다른 답변에서 알 수 있듯이, 선택 사항을 남기거나 분리 점을 사용하거나 세트와 교차점에 대해 명시 적으로 추론하여 Prolog로이를 표현하는 직접적인 방법이 있습니다.

제약을 사용하면 더 많은 것을 알 때까지 목표를 지연시킬 수 있습니다. 예를 들어 원자를 정수로 매핑 한 다음 변수의 멤버십을 정수의 특정 도메인을 갖는 집합으로 나타낼 수 있습니다 , CLP (FD)   제한을 사용하십시오. 또는 속성 변수 나 제약 조건 처리 규칙을 사용하여 원자 이상으로 인한 사용자 지정 제약 조건 해결자를 구현할 수 있습니다.   (CHR). 두 경우 모두의 주요 이점은 더 많은 자유를 얻을 수 있다는 것입니다. 목표를 다시 주문하십시오. 제약 조건 추론은 추가 제약 조건이 게시 될 때 암시 적으로 호출됩니다.

EDIT : 예를 들어, CLP (FD) 제약을 사용하여 작업을 해결하는 것을 고려해보십시오. 최소한의 수정으로 다음 예제는 SICStus, SWI, YAP 및 기타 시스템에서 작동합니다.(당신은 CLP를 사용할 수 있도록, 정수에

 
fruit_integer(apple, 0). 
fruit_integer(pear, 1). 
fruit_integer(orange, 2). 

variable_fruits(Var, Fruits) :- 
     maplist(fruit_integer, Fruits, Integers), 
     foldl(domain_, Integers, 1..0, D), 
     Var in D. 

domain_(E, D0, D0 \/ E). 

이 경우의 핵심 아이디어는 에지도 과일 FD를 : 당신의 프롤로그 시스템에 따라, 이러한 조건의 일부를 사용하기에 적합한 라이브러리를 가져와야합니다)   제약 조건을 모두 표현합니다.

귀하의 예를 질의 및 답변 : 분명히

 
?- variable_fruits(X, [apple,pear]), fruit_integer(apple, X). 
X = 0. 

?- variable_fruits(X, [apple,pear]), 
    fruit_integer(apple, X), 
    fruit_integer(pear, X). 
false. 

?- variable_fruits(X, [apple,pear,orange]), 
    variable_fruits(X, [apple,orange]). 
X in 0\/2. 

?- variable_fruits(X, [apple,orange]), 
    variable_fruits(X, [pear,orange]). 
X = 2. 

?- variable_fruits(X, [apple,orange]), 
    fruit_integer(pear, X). 
false. 

, 당신은 다른 방향으로도 fruit_integer/2을 사용하고 원자의 목록에 다시 같은 정수와 도메인을 변환 할 수 있습니다. 나는 이것을 쉬운 운동으로 남겨 둔다.

은 CLP (FD) 제약 유한 도메인을 통해 제약라고하는 것이 이런 이유입니다 : 모든 유한 한 도메인은 유한 집합   정수의에 매핑 할 수 있습니다. 따라서 CLP (FD) 제약 조건은 일반적으로 정수 연산을 표현하는 데 유용 할뿐만 아니라 임의의 한정된   집합에 대해서도 추론하는 데 유용합니다. 자세한 내용은 을 참조하십시오.

몇 가지 추가 참고 사항 : 당신이 그들을 사용하는 경우

  • CLP (FD) 제약 모든 가장 널리 사용되는 프롤로그 시스템 선박, 솔루션은 매우 휴대용 만들기.
  • 일부 Prolog 시스템은   세트의 전용 제약 조건 해결자를 제공합니다.입니다. 이것은 시스템이  을 지원하는지 살펴볼 가치가 있습니다.
  • CHR은 사용자 지정 전파 규칙을 정의하는 데 유용한 언어이며 특히 더 복잡한 작업을 조사 할 가치가 있습니다.
  • 속성이있는 변수 인터페이스를 직접 사용하면 솔루션의 이식성이 떨어지게되므로 대신 상위 수준 방법 중 하나를 사용하는 것이 좋습니다. 먼저 적용하기 쉽기 때문에 CLP (FD)를 먼저 시도한 다음 CHR을 살펴보고 맞춤 솔버를 구현하는 것을 고려하십시오.
+0

'더 많은 것을 알기 전까지는 목표를 연기하도록했습니다. 이것이 제 첫 목표였습니다. 당신은 그것을위한 mwe를 줄 수 있습니까? 나는 귀인 변수에 새로운입니다. –

+1

예제와 몇 가지 추가 노트를 추가했습니다. 나는 그것이 도움이되기를 바랍니다. – mat

1

당신은 member/2 사용할 수 있습니다

24 ?- member(X, [apple, pear]), member(X, [apple]). 
X = apple ; 
false. 

25 ?- member(X, [apple, pear]), member(X, [apple]), member(X, [pear]). 
false. 

26 ?- member(X, [apple, pear, orange]), member(X, [apple, orange]). 
X = apple ; 
X = orange. 

27 ?- member(X, [apple, orange]), member(X, [pear, orange]). 
X = orange. 

28 ?- member(X, [apple, orange]), member(X, [pear]). 
false. 

또는 모델이 가능한 값의 목록과 함께, 가능성 좁혀 intersection/3를 사용 : 어쩌면 당신은 잘못된 구문을 사용하고

35 ?- _X1=[apple, pear], intersection(_X1, [apple], X2). 
X2 = [apple]. 

36 ?- _X1=[apple, pear], intersection(_X1, [apple], _X2), 
         intersection(_X2, [pear], X3). 
X3 = []. 

37 ?- _X1=[apple, pear, orange], intersection(_X1, [apple, orange], X2). 
X2 = [apple, orange]. 

38 ?- _X1=[apple, orange], intersection(_X1, [pear, orange], X2). 
X2 = [orange]. 

39 ?- _X1=[apple, orange], intersection(_X1, [pear], X2). 
X2 = []. 
+0

기술적으로 당신의 대답은 내 요청에 대한 두 가지 해결책을 제시하지만 나는 질문을 게시 할 때보다 효율적인 방법을 원했습니다. I) 첫 번째 해법은 효과적이지만, 많은 선택 지점에 살아서 두 개의 술어 사이에 몇 가지 절차가있는 경우 많은 역 추적을 야기하기 때문에 매우 비효율적이다. 회원 (X, [사과, 배]) 및 회원 (X, [사과]). II) 두 번째 솔루션은 첫 번째 솔루션보다 훨씬 뛰어나므로 그 대답을 받아들입니다. –

0

를 :

?- X = apple ; X = pear. 
X = apple ; 
X = pear. 

하지만 저는 Will Ne ss.

0
이 문제가 계층 구조를 입력 관련,이 후자에 의해 촉발되고, 하나 개의 효율적인 솔루션이 논문에 제시하는 방법을 명확하지 않았다 내 대답에

비록 : 는 입력 기능 구조, 제럴드의 PROLOG 인코딩 최적화 된 PENN의 Colmerauer의 방법를 사용하고 간단하게 말 1999 :

'apple or pear' = f(0,_,1,1). 
'pear or orange' = f(0,0,_,1). 
'orange or apple' = f(0,X,X,1). 
'apple' = f(0,1,1,1). 
'orange' = f(0,0,0,1). 
'pear' = f(0,0,1,1) 

이 모든 외연이 프롤로그 일치 순종 : '사과 나 배는'사과 '와'배 '를 포섭, 통합 '사과 또는 오렌지' i 사과 또는 배는 사과를 제공합니다.