2016-09-28 4 views
2

Ich habe eine Frage bezüglich der Variablen erstellen im Programm. Lets sagen, ich habe eine Funktion (? - nicht sicher über den Wortlaut hier), die/2 ist, gibt es eine Möglichkeit, es zu ändern/1?Erstellen einer neuen Variablen mit Prolog-Programm

Gibt es eine Möglichkeit, es tatsächlich zu lösen (N), wo L auf dem Lauf erstellt wird. jetzt beide versucht, mit

L is [A,B,C,D], 

oder

L = [], 
L is [A,B,C,D] 

aber kein Glück.

Programm ist wie das Arbeiten: ->

?- solve(30,Elements). 

1+2+3+5=11 
Elements = [1, 2, 3, 5]. 

?-  solve(60, Elements). 

1+2+3+10=16 
Elements = [1, 2, 3, 10] ; 

1+2+5+6=14 
Elements = [1, 2, 5, 6] ; 

1+3+4+5=13 
Elements = [1, 3, 4, 5] ; 
false. 

Antwort

1

Ja, aber dann würden Sie zum Beispiel erhalten:

?- solve(30). 

1+2+3+5=11 
true. 

?- solve(60). 

1+2+3+10=16 
true ; 

1+2+5+6=14 
true ; 

1+3+4+5=13 
true ; 
false. 

Wenn das ist, was Sie suchen nur solve(N) schreiben statt solve(N, L):

:- use_module(library(clpfd)). 
solve(N):- 
     L = [A,B,C,D], 
     L ins 1..sup, 
     N #= A * B * C * D, 
     all_distinct(L), 
     A #< B, B #< C, C#< D, 
     labeling([],L),nl, 
     Z #= A+B+C+D, 
     write(A+B+C+D=Z). 

beachten Sie, dass L is [A,B,C,D] nicht Vali ist d weil is/1 für arithmetische Ausdrücke nicht Vereinigung verwendet wird. Sie müssen =/2 verwenden, die L mit einer Liste mit vier Elementen vereint.

Wenn Sie die Liste ausdrucken möchten könnten Sie schreiben:

:- use_module(library(clpfd)). 
solve(N):- 
     L = [A,B,C,D], 
     L ins 1..sup, 
     N #= A * B * C * D, 
     all_distinct(L), 
     A #< B, B #< C, C#< D, 
     labeling([],L),nl, 
     Z #= A+B+C+D, 

     writeln(A+B+C+D=Z), 
     write("Elements="), 
     write(L). 

Beispiel:

?- solve(30). 

1+2+3+5=11 
Elements=[1,2,3,5] 
true. 
+0

Gibt es eine Möglichkeit, dies zu tun mit lösen (N), aber immer noch die Elemente in der Liste zeigt? –

+0

Nur wenn Sie die Liste drucken (mit write - um jedes Element von L zu drucken). – coder

+0

Die Antwort aktualisiert, um die Liste zu drucken – coder

2

Sie zu „verstecken“ können versuchen, die Ausgangsgröße, und schreiben Sie es selbst, wie du bist bereits getan: einfach das zweite Argument aus dem Kopf der Prädikatdefinition entfernen:

Dann:

?- solve(30). 

1+2+3+5=11 
true. 

Aber das ist wirklich kontraproduktiv. Der "Prolog" -Weg besteht darin, nur die oberste Ebene für das Drucken zu verwenden. Zum Beispiel würde ich völlig das manuelle Schreiben von Ihrer Definition entfernen:

:- use_module(library(clpfd)). 
solve(N, Z-L):- 
     L = [A,B,C,D], 
     L ins 1..sup, 
     N #= A * B * C * D, 
     all_distinct(L), 
     A #< B, B #< C, C#< D, 
     Z #= A+B+C+D, 
     labeling([],L). 

Dann:

?- solve(30, Solution). 
Solution = 11-[1, 2, 3, 5]. 

Doch auch diese suboptimal ist. Es ist besser, die Kennzeichnung außerhalb des Prädikats zu lassen, die die Zwänge stellt:

solve(N, Z-L):- 
     L = [A,B,C,D], 
     L ins 1..sup, 
     N #= A * B * C * D, 
     all_distinct(L), 
     A #< B, B #< C, C#< D, 
     Z #= A+B+C+D. 

Wenn es keine Rest Einschränkungen sind, können Sie immer noch die Lösung erhalten sofort:

?- solve(30, Solution). 
Solution = 11-[1, 2, 3, 5]. 

(Wir nicht labeling/2 nennend überhaupt nicht mehr!)

Wenn Sie besonders das A + B + ... = Sum Format der Lösung mögen, können Sie immer noch die oberste Ebene den Druck für Sie tun lassen. Ändern Sie einfach den Kopf Ihres Prädikat:

solve(N, A+B+C+D=Z) :- 
    % rest as in the last example 

Dann:

?- solve(30, Solution). 
Solution = (1+2+3+5=11). 
Verwandte Themen