2010-12-16 45 views
0

我是prolog的新手,我必須編寫一個關於水的程序 水壺。我的問題是關於水罐的初始狀態和查詢 形成。查詢的格式如下:Prolog查詢問題

?- myPredicate(args), filled(j1,1) 

含義j1裝滿1加侖水。 j1代表一個壺;另一個是j2。 Initally,我有

filled(j1,0) 
filled(j2,5) 
capacity(j1,2) 
capacity(j2,5) 

我真的很感激,如果你爲我提供有關下列信息:

問題答:我必須聲明我的計劃內J1的初始狀態? filled(j1,0)

問題B:我需要讓我的程序找到填充(j1,1)的 的解決方案。爲此,我有一些想法,但我不確定 約,是如何更新填充(J,卷)從查詢和 myPredicate

我很困惑,因爲我有初始狀態filled(j1,0)現在 我要創建一個在myPredicatefilled(j1,1)。所以我應該在myPredicate中有filled(J,Volume)的形式,所以查詢返回true而不是false。

如何將filled(J,Voume)納入myPredicate以便上述查詢運行時,我可以顯示正確答案?

+2

*「...和我**有**編寫程序...」 - - 這是功課嗎? – thkala 2010-12-16 18:16:22

+1

我不清楚究竟是什麼問題。你能給我一個關於大學收到的問題的完整描述嗎? 不知道什麼是確切的問題在這裏,我不能給你一個答案,但..在這裏我發現了一個非常類似的問題,你的答案已經給予http://www.informatik.uni-freiburg.de/~ki/教學/ ws0708 /邏輯/ prolog7.pdf,幻燈片17日起 – matcheek 2010-12-17 03:14:58

回答

-2

使用傳入參數,初始事實和要執行的迭代任務的示例程序。迭代是通過遞歸來實現的。在每次重新進入之前,可以有效地更新與某​​個參數有關的值,以用於下一輪。

my_loop(N) :- N > 10. 

my_loop(N) :- N =< 10, 
    write(N), nl, 
    Nextin is N + 1, 
    my_loop(Nextin). 

:- my_loop(1). 

答:
給定的信息(事實)由 程序所需。它們可以通過鍵盤輸入提供,作爲初始的 參數給一些謂詞,或者作爲 建議的數據庫中的事實。此外,只針對特殊情況建議,事實 可以被硬編碼到某些謂詞或規則中。

下面和上面是作爲參數傳遞初始信息的示例::- my_predicate(args...)

如果有很多事實,數據庫是最好的。一些事實,即每次需要更改 最好從鍵盤獲得。否則, 它可能沒關係。

:- my_predicate([fill(j1,0),fill(j2,5)], Answer), 
    write(Answer), 
    nl. 

B:

_ 循環例如:

在my_loop,計數[1..10]的任務迭代求解。 作爲參數傳遞給參數:1,主要是因爲 程序反覆做同樣的事情:
1.取一個數(N);如果太大,就退出。否則...
2.打印它。
3.計算下一數(N + 1)
4.重複

10是硬編碼的。這可能是一個事實:stop_after(10)

現在的數據進行操縱,在my_loop可變Ñ,和 {J1,J2}在比如說myPredicate實際上並不需要被重新分配過和一遍:見my_loop。重新輸入 計算時,它的時間做同樣 的事情,但使用不同的參數:

cap(j1,2). 
cap(j2,5). 

my_predicate(Status, Answer) :- 
    got_juice(Status,0), 
    Answer=Status. 

%%% Instead of changing values, rerun comp. with new values 
%%% based on a computation made from the old ones. 
my_predicate([filled(j1,J1), filled(j2,J2)], Answer) :- 
    Used is J1 + J2, 
    got_juice(Used, J), J \= 0, 
    cap(j1,C1), cap(C2), 
    %% Use cap and filled to add more to filled.. 
    NextJ1 is J1 + ..., 
    NextJ2 is J2 + ..., 
    my_predicate(filled(j1,NextJ1), filled(..., Answer). 

注:
上面的謂詞只是證明在Prolog的迭代,使用的參數「 myProgaram」。有關實際實現,請參閱matcheek評論中提出的程序。

+0

-1作業問題的過度詳細的答案。 – 2010-12-20 19:37:30