2016-11-20 111 views
0

我做了一個計算矢量長度和二維數組大小的函數。Prolog'=='運算符不工作?

以下是功能。我使用SWI-Prolog的

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
write("vector len : "), write(COUNT1), 
write(", 2D array size : "), write(COUNT2). 

是的,我特意排除詳細listLength, twoDarray功能。

但是兩個函數是正確的。所以,COUNT1變量存儲矢量長度和COUNT2變量存儲二維數組大小。

另外輸入變量LIST表示向量。二維表是固定的(7乘7)。

當我運行與輸入的代碼:

- FOO([1,2,3,4,5])。

它輸出:

矢量LEN:5,2D陣列尺寸:49

result(1)

但是,當我改性上述像下面的代碼,

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2), 
(COUNT1 == COUNT2). 

功能沒有終止。我的目標是比較COUNT1COUNT2。如果兩個變量相同,則返回true,否則返回false

但是,即使輸入相同,它也無法正常工作。

result(2)

是什麼原因造成的,我怎麼能解決這個問題?

回答

0

由於Prolog解釋器在目標失敗時回溯,因此它會重試twoDarray/1以防COUNT2返回其他值。默認情況下,Prolog關係有多個答案。你必須告訴Prolog機器一個特定的關係是一個函數,也就是說它只允許有一個答案。

爲了說明關係是功能性的,可以使用cut運算符。如果您不想更改twoDarray/1listLength/2的定義,則可以直接在您的定義foo/1中引入剪切。切割操作符由感嘆號字符表示。

foo(LIST) :- listLength(LIST, COUNT1), twoDarray(COUNT2),!, 
(COUNT1 == COUNT2). 
0

下面的代碼

listLength(_, 5). 
twoDarray(49). 

foo(LIST) :- 
    listLength(LIST, COUNT1), 
    twoDarray(COUNT2), 
    (COUNT1 == COUNT2). 

工作(立即返回錯誤)我gprolog和我SWI-序言。

所以,我認爲,問題出在你的listLength/2或在您的twoDarray/1

建議:代替你listLength/2與我的假,然後再試一次。

下一頁嘗試用我的假twoDarray/1