다음 코드가 주어집니다.
fun(a, [b]).
fun(b, [c]).
fun(c, [d]).
fun(d, [e]).
fun(e, []).
xyz(X, Y):-
fun(X,Z) -> findall([A|B], (member(A,Z), xyz(A,B)), L),
flatten(L,F), sort(F,J), reverse(J,Y); Y = [].
쿼리를 사용하여 xyz(a,X)
예상 출력을 얻습니다 X = [e,d,c,b].
.
이 문제를 어떻게 해결할 수 있습니까? 이것이 정렬 기능과 관련이 있습니까? 그렇다면 아래 링크의 문서에 따르면 알파벳 또는 숫자 우선 순위가이 문제를 해결할 수 있지만 여전히 cs40
is going before로 설명 할 수 없습니다 cs30
. 상관 관계를 찾는 데 어려움을 겪고 있습니다. 이 문제를 어떻게 해결할 수 있습니까?
http://www.swi-prolog.org/pldoc/doc_for?object=sort/2 http://www.swi-prolog.org/pldoc/man?section=compare
그건 그렇고, fun 함수는 fun (a, [b, c]와 같은 다중 요소 목록을 가질 수 있습니다 . 여기서 a
다중 종속성 b
및 c
.이 측면은 제가 현재 가지고있는 문제와 관련하여 그다지 중요하지 않습니다. 이 사실.
@lurker 덕분에 저는 큰 진전을 이루었습니다.
다음 코드가 주어집니다.
final_xyz(X, Y):- xyz(X, R), reverse(R, Y).
xyz(X, Y) :-
fun(X,Z) -> findall([A|B], (member(A,Z), xyz(A,B)), L),
flatten(L,Y); Y = [].
이 문제를 해결하기 위해 코드를 다음과 같이 업데이트했습니다.
xyz-final(X,Y):-
fun(X,Z),
Z\=0,
( length(Z,1) -> xyz(X,J), reverse(J,Y)
;
xyz2(X,B), sort(B,C), reverse(C,Y)
).
xyz(K, [X|Y]):- fun(K, [X]), !, xyz(X, Y).
xyz(_, []).
xyz2(X, Y) :-
fun(X,Z) -> findall([A|B], (member(A,Z), xyz2(A,B)), L),
flatten(L,Y); Y = [].
매우 서투른 접근 방식이지만 지금은 저에게 효과적입니다. 더 효율적으로 만들기 위해 노력하겠습니다.
문제는 최종 결과를 되돌리고 싶지만 .NET에 대한 각 재귀 호출에서 반대가 수행된다는 것입니다 xyz/2
. 당신이 할 경우 trace
당신의 xyz(cs140a, X)
전화, 당신은 다른 재귀에 몇 번 호출되는 것 볼 수 있습니다.
마지막에 한 번 원하면 다음과 같이 작성할 수 있습니다.
final_xyz(X, Y) :-
xyz(X, R),
reverse(R, Y).
xyz(X, Y) :-
fun(X,Z) -> findall([A|B], (member(A,Z), xyz(A,B)), L),
flatten(L,Y); Y = [].
그리고 다음을 호출 final_xyz(cs140a, X)
하면 X = [m16a,cs30,cs40,cs110]
.
xyz
방지 술어 findall
와를 flatten
. 이 버전은 순환 경로를 피해야하며 중복을 표시하지 않습니다.
xyz(X, Y) :-
fun(X, L),
xyz(L, [], R),
reverse(R, Y).
xyz([H|T], A, R) :-
( memberchk(H, A)
-> xyz(T, A, R)
; fun(H, L)
-> xyz(L, [H|A], R1),
xyz(T, R1, R)
; xyz(T, [H|A], R)
).
xyz([], A, A).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다