2013-10-09 2 views
0
boolean(true). 
boolean(false). 
formula_0(P, Q):- (P; Q), \+ P. 

solution_for_formula(P, Q, Formula):- 
    maplist(boolean, [P, Q]), call([Formula, P, Q]). 

earlier question의 후속 조치. 왜이게 효과가 없을까요? (call([Formula, P, Q])formula_0(P, Q)으로 바꾼다면상위 순서 술어

답변

4

이 아니라 call([Formula, P, Q])이 필요합니다. 대괄호를 제거하기 만하면됩니다. 오류가 무엇인지 명확하게하려면 다음을 시도하십시오.

?- write_canonical(call([Formula, P, Q])). 
call('.'(_,'.'(_,'.'(_,[])))) 
true. 

즉. 대괄호를 사용하면 (아마도) 정의하지 않은 (.)/2 술어가 호출됩니다. 그러나 호출 할 상위 순서 술어는 call/3이며 인수는 call(Closure, Arg1, Arg2)입니다. 예 : call(formula_0, true, false)formula_0(true, false)으로 전화 할 것입니다.

+0

고마워요! 그것은 실제로 피곤한 첫 번째 일 이었지만 자동 완성은 나에게 속임수였습니다. 그래서 혼란스러워하고 술어를 나타내는 여러 가지 방법을 더 찾았습니다. 검색하는 동안 나는 형식을 만났다 :'[f, arg0, arg1, ...]'. 이 양식이 언제 적용될 수 있는지 알려주시겠습니까? –

+2

'(= ..)/2' 표준 술어의 인수로 사용하면 용어와 그 목록 표현 사이를 변환 할 수 있습니다. 예 : 'foo (A, 1) = .. [foo, A, 1]'호출은 참입니다. –

+0

아, 고마워! 또한 http://en.wikibooks.org/wiki/Prolog/Higher_Order_Programming 형식을 찾은 참고 문헌을 발견했습니다. –