2012-04-19 59 views
1

如何在代碼中執行查詢?代碼中的序言查詢

例如:

person(abe,instructor). 
person(bob,student). 
person(cindy,student). 
person(david,student). 
person(abe,student). 

% Like this, but this does not work 
% :- person(X,Y). 

加載程序後,我可以運行下面的查詢:人(X,Y)。

我怎樣才能運行此查詢的程序本身,以便程序加載一次,它會運行查詢和輸出的一部分:

X = abe, 
Y = instructor ; 
X = bob, 
Y = student ; 
X = cindy, 
Y = student ; 
X = david, 
Y = student ; 
X = abe, 
Y = student. 

回答

1

你可以只創建一個新的謂詞。2種不同的方式在這裏。第一個找到所有人(X,Y),將​​它們放入AllPeople列表中,然後寫出來。

第二個是'失敗驅動循環',它執行第一個匹配,寫出來,然後告訴序言再試一次,即'失敗',它繼續直到沒有更多的匹配,然後匹配第二個謂詞同名,以確保謂詞最終返回true。

showpeople1 :- 
    findall(X/Y, person(X,Y), AllPeople), 
    write(AllPeople). 

showpeople2 :- 
    person(X, Y), 
    write(X), write(','), write(Y), nl, 
    fail. 

showpeople2 :- true. 



?- showpeople1. 
[abe/instructor,bob/student,cindy/student,david/student,abe/student] 
true. 

?- showpeople2. 
abe,instructor 
bob,student 
cindy,student 
david,student 
abe,student 
true.