2014-11-17 4 views
1

논리 수수께끼로 일을하고 내가 어떻게 작동하는지에 대한 일반적인 생각을 가지고이 코드 예제에서 http://www.anselm.edu/internet/compsci/faculty_staff/mmalita/HOMEPAGE/logic/bufalo.txt확실이 /가 무엇을 좀 프롤로그 예제를 통해보고 된

first_names([keith,libby,margo,nora,otto]). 
last_names([fell,grant,hall,ivey,jule]). 
ages([2,3,4,5,6]). 

start(Sol):- first_names(F),last_names(L),ages(A), 
     Sol=[[F1,L1,A1],[F2,L2,A2],[F3,L3,A3],[F4,L4,A4],[F5,L5,A5]], 
       F=[F1,F2,F3,F4,F5],    % if order is not important! 
     member([libby,jule,_],Sol), % 1 
     set_equal([L1,L2,L3,L4,L5],L), % write correspondence 
     set_equal([A1,A2,A3,A4,A5],A), 
       member([keith,_,AgeK],Sol),  % 2 
     member([_,ivey,AgeI],Sol),AgeK is AgeI+1, 
     member([nora,_,AgeN],Sol),AgeI is AgeN+1, 
     member([margo,_,AgeM],Sol), 
     member([_,fell,AgeF],Sol),AgeF is 3+AgeM, 
     member([otto,_,AgeO],Sol),member([_,hall,AgeH],Sol). 

우연히,하지만 난 것 구체적으로 모르겠다.

첫 번째 필드는 성으로, 두 번째 필드는 성으로, 세 번째 필드는 밑줄로 밑줄이있는 누락 된 정보가있는 원자 목록으로 정의하는 것이 좋습니다. 그러나 왜 이것이 Sol 배열에 멤버와 함께 호출되고 있는지 잘 모르겠습니다. 이 컨텍스트에서 무엇을하는지 확신 할 수 없음

또한이 코드에서는 set_equal 및 F =의 목적을 이해하지 못합니다. 그것은 전혀 참조되지 않은 세 가지 변수를 설정하는 것 같습니다.

도움 주셔서 감사합니다. bibmm.pl에서 구문 몇 가지 문제가있다, 적어도 set_equal/3으로 변경해야합니다 :

답변

0

나는 SWI - 프롤로그와 테스트가 제공 한 링크의 코드를 다운로드 한

set_equal([H|T],R):- member(H,R),select(H,R,Rez),set_equal(T,Rez). 
상기 보정 후

, 그것은 생산 않는이 상기 솔 부재에 호출되는 이유는 지금

?- start(X). 
X = [[keith, fell, 5], [libby, jule, 6], [margo, grant, 2], [nora, hall, 3], [otto, ivey, 4]] ; 
X = [[keith, fell, 6], [libby, jule, 2], [margo, grant, 3], [nora, hall, 4], [otto, ivey, 5]] ; 
X = [[keith, fell, 5], [libby, jule, 6], [margo, hall, 2], [nora, grant, 3], [otto, ivey, 4]] ; 
X = [[keith, fell, 6], [libby, jule, 2], [margo, hall, 3], [nora, grant, 4], [otto, ivey, 5]] ; 
X = [[keith, grant, 4], [libby, jule, 5], [margo, ivey, 3], [nora, hall, 2], [otto, fell, 6]] ; 
X = [[keith, hall, 4], [libby, jule, 5], [margo, ivey, 3], [nora, grant, 2], [otto, fell, 6]] ; 
false. 

,

어레이

/2 허용 값을 슬롯에 결합되므로 bibmm.pl에 명시된 바와 같이, 즉, 부분적으로 지정된 행 temptative 값을 얻을 것이고, 프롤로그 '되돌아가 해당 순열의 검색을 제공 부재 set_equal/2에 의해 생성됩니다.

F = [...]에 대해서 F는 시작/1 절차에서 더 이상 사용되지 않기 때문에 저자의 미적 선택이라고 생각합니다. 내가 발견하지

start(Sol):- first_names([F1,F2,F3,F4,F5]),last_names(L),ages(A), 
... 

편집뿐만 아니라 작성하지만, 버그가 마지막 제약 누락, 즉이 될 수 있습니다. 추가 한 후에는

... 
member([otto,_,AgeO],Sol),member([_,hall,AgeH],Sol), 
AgeO is AgeH * 2. 

결과는 내가 코드에서 그 초기 set_equal가 무엇 확실하지 않다

?- start(X). 
X = [[keith, fell, 5], [libby, jule, 6], [margo, hall, 2], [nora, grant, 3], [otto, ivey, 4]] 
+0

, 당신은 나를 위해 제발 고장날 수 틀림없이 더 나은 무엇입니까? – user1066886

+0

그것은 '내 코드'가 아니므로, 내가 제공 한 링크에서 가져 왔습니다 ... 어쨌든, 순열 방식으로 순열을 생성합니다. 라이브러리 /리스트에 순열이 2 개 있기 때문에 – CapelliC