문제

나는 방금 Prolog로 시작했고 다음과 같이 예상대로 다음이 작동하지 않는 이유를 알 수 없습니다. 목록 L2가 L1에 포함 된 경우 TRUE를 반환하는 술어를 만들려고합니다. 이것이 제가 쓴 것입니다.

assert(contains (L1, L1)).
assert(contains(L1, [X|L2]):-member(X, L1), contains(L1, L2)).
assert(contains(L1, [])).

나는 이것이 "L3 = X | L2 '가 L1에 있고 L2가 L1에있는 경우"라면 "L1, L2)를 포함하여 모든 구성원 중 하나가 이동할 때까지 재귀 적으로 번역 될 것입니다. 그리고 우리는 마지막 옵션이 남아 있거나 L1에 있지 않은 멤버를 찾아서 술어에 실패 할 것입니다.

불행히도 그런 식으로 작동하지 않는 것 같습니다. 멤버 (x, l1)의 값 만 반환하는 것 같습니다 ([1,2,3], [1,4,5]) 패스를 포함하지만 ([1,2,3], [4, 1,5]).

내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

나는 당신의 질문을 완전히 이해하지 못했지만 나는 contains/2 다음과 같은 술어 :

% An empty list is contained by any list
contains(_, []).

% If a list is not empty, then its
% first element must be an element of L1,
% and its tail must be contained by L1.
contains(L1, [X | L2]) :-
    member(X, L1),
    contains(L1, L2).

BTW, 첫 번째 규칙 (사실)

contains (L1, L1).

구문 오류입니다 (술어 이름 뒤에 공간이 없어야 함). 또한 수정되면 원치 않는 선택 점이 생성됩니다. 차라리 삭제하십시오.

사용하려는 경우 assert/1 프롤로그 프롬프트에서 실행하십시오

?- assert(contains(_, [])).

Yes
?- assert(contains(L1, [X | L2]) :- (member(X, L1), contains(L1, L2))).

Yes

지식 기반에서 무엇이 끝났는지 확인하려면 사용하십시오. listing/0.

?- listing.

:- dynamic contains/2.

contains(_, []).
contains(B, [A|C]) :-
    member(A, B),
    contains(B, C).

Yes

나는 당신이 당신의 자신의 대답에서 나타나는 것처럼 문제가 "자유 변수를 주장"하는 것이라고 생각하지 않습니다. 오히려 브래킷을 확인하십시오.

다른 팁

분명히 무료 변수에 어서를 사용하면 문제가 발생할 수 있으므로 (적어도이 버전에서) 잘못 행동 한 이유입니다. Asserts를 삭제하고 Consult (File) 명령을 사용하여이를 해결했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top