2010-11-28 2 views
3

사실로 주장하지만, 난 그냥 '프롤로그 : 술어 솔루션을 얻기 내가 특정 문제를 가지고

... 그래서 다른 사람들도 혜택을 누릴 수있는 시도하고 일반적인 질문 올 것이다 많은 솔루션 X=2; X=7

X=5;을 즉 내가 이러한 솔루션의 각을 얻고 나는이 경우 세 가지 사실을 끝낼 수 있도록 다음 프롤로그 사실로를 주장 술어를 원하는 반환하는 조건을 가지고했습니다 예 fact(2) fact(7)

fact(5)

그렇게 fact(5)를 호출하는 것은 사실 일 것이다하지만이 솔루션을하지 않았기 때문에 우리가 그것을 주장하지 않기 때문에 fact(8)를 호출하는 것은 잘못된 것입니다.

하지만 나는 각 단일 사실을 주장하는 해결책을 계속 요구해야하는 부분을 갖고 싶지 않습니다. 나는 술어를 호출하여 백그라운드에서 모든 솔루션을 통과시키고 주장한다.

해결 방법 중 하나는 findall을 사용하여 모든 솔루션을 목록에 넣은 다음 목록의 각 요소를 지정하는 목록을 살펴 보는 것입니다. 그러나, 나는 이것이 매우 우아하다고 생각하지 않는다. 리스트를 둘러 보지 않고 그것을하기에 더 좋은 방법이 있어야합니다.

답변

4

모든 솔루션에 비해 되돌아 강제로 실패 기반 루프를 사용 : 당신은 무시할 수

?- computation(X), false. 

를이 쿼리의 선언적으로 false false 값을 무시/1 :

?- ignore((computation(X),false)). 
+0

안녕 매트, 이걸 축하해. 이 작품 :). 나는 내가 어떻게 확신하는지 모르겠다. 나는 내가 까다 롭다는 것을 알고 있지만 술어를 무시하는 것에 대해 확신 할 수는 없지만 나는 확실히 당신에게 고마워하지 않는다. 나는 떠날 것이고 이것에 대해 생각해보고 무슨 일이 벌어지는지를 볼 때 이것을 해결 된 것으로 표시 할 것입니다. – ale

+0

+1. @shuyin - 이것은'computation/1'이 성공적으로'false /'를 수행 한 후에 실행될 때마다 (즉, _failure-driven_) Prolog가 실행하기 위해 되돌릴 선택점 (대안 옵션)을 남기기 때문에 효과적입니다.이것은 '계산/1'이 실패/역 추적에서 철회되지 않은 (또는 취소 된) 솔루션의 '주장'을 수행 할 것을 요구합니다. 일단 모든 선택 사항이 고갈되고 주장된다면, Prolog는'false'를 수행 할 수밖에 없으며, 실패로 끝나지 만 그림과 같이'ignore/1'을 사용하여 결과를 무시함으로써 수정됩니다. – sharky

3

이 기능은 setof를 사용하고 2 차 조건자를 만들어서 만들 수 있습니다. 우리가 사실에 대해 가서 물어 보면

:- dynamic fact/1. 

isAns(5). 
isAns(2). 
isAns(7). 

computation(F) :- setof(X,call(F,X),S),factify(S). 

factify([X|Xs]) :- assert(fact(X)),factify(Xs). 
factify([]). 

그런 다음 우리가 얻을 :

computation(isAns), fact(X). 
X = 5; 
X = 2; 
X = 7; 
false 
+0

안녕하세요, 고마워요. 그러나 내가 여기서 고심하고있는 것에 중요한 차이가있다. 이미 사실이 있습니다 - isAns/1 사실. 그렇다면 정수가 사실인지 확인한 다음이 사실을 다른 것으로 즉 fact/1로 지정하는 것입니다. 그래서''- 계산 (X)'을하면'X = 5, 2, 7, false'가됩니다. 그러나 원하는 것은'comput (X)'를 수행하고'true'를 반환하는 것입니다. 내 사실을 모두 주장 즉 X는 5,2,7과 동등하지만 날 '누르면'; '을 유지하는 데 필요한하지 않은 경우 – ale

+0

내 질문을 명확하게 희망 : D – ale

+0

@ shuyin, 나는 조정 귀하의 질문에 더 잘 맞는 내 대답. 나는 네 질문을 완전히 잘못 해석했다. 나는 이것이 당신이 원하는 바란다. – HaskellElephant