2012-11-30 5 views
1

프롤로그 재귀 함수 : 난은 예컨대리스트 의 각 요소와 C를 인쇄 할 : C = 30 [H는 | T] = -13, -10, -30]프롤로그에서 no를 방지하는 방법은 무엇입니까?

myfunc(C,[H|T]):- 
    (\+([H|T]=[])), 
    write(C), write(' with '), write(H), nl, 
    myfunc(C,T). 

나는 처음에 목록의 머리가 비어 있지 않은지 확인합니다. 그것은이 출력 내가 원하는 것입니다하지만 난이 '더'는 말에이뿐만 아니라 실패 할 부모 함수를 만들기 때문에 얻을 싶지 않다 나에게이 출력

30 with -9 
30 with -10 
30 with -30 

    (32 ms) no 

을 제공합니다! 어떻게 제거하고 대신 '예'를 넣을 수 있습니까?

답변

3

간단한 방법 : 빈 목록이있는 기본 사례를 추가하기 만하면됩니다.

myfunc(_, []) :- !. 

myfunc(C,[H|T]):- 
    write(C), write(' with '), write(H), nl, 
    myfunc(C,T). 

시험 :

?- myfunc(30, [1, 2, 3]). 
30 with 1 
30 with 2 
30 with 3 
true. 

이가 할 수있는 최선의 방법 인 경우 나도 몰라,하지만 당신은 우리에게 전체 프로그램에 대한 많은 정보를주지 않았다, 그래서 나는 선택했다 술어의 작은 수정. 당신이 당신의 프롤로그에 maplist 경우

+0

덕분에 많이

myfunc(N, L) :- maplist(my_write(N), L). my_write(N, Val) :- format('~w with ~w~n', [N, Val]). 
SWI - 프롤로그와

및 모듈을 작성할 수 있습니다! : D 그것이 작동했습니다 – CSawy

+0

format/2 : format ("~ w \ n", [C, H]와 함께 사용하는 것을 고려하십시오. – mat

2

, 당신은 lambda

:- use_module(library(lambda)). 

myfunc(N, L) :- 
    maplist(\X^format('~w with ~w~n', [N, X]), L). 
관련 문제