برولوغ هو / 2 ، الحجج لم مثيل بما فيه الكفاية
-
21-12-2019 - |
سؤال
أنا أعمل على مهمة حيث قمت بإنشاء محلل للغة حسابية تدوين البادئة.أنا بحاجة إلى كتابة المسند الذي يبني أست لأي قيمة معينة الخامس (أي.توليد أست مثل أنه كلما يتم تقييم انها قيمة الخامس).كانت فكرتي بسيطة بما فيه الكفاية:
genAst(Val, Env, Ast) :-
ev(Ast, Env, Val).
حيث إيف هو تقييم المسند.عند تشغيل هذا أحصل على الخطأ على العنوان المتعلق بهذا الجزء من المسند إيف:
ev(xer_(power(N)), Env, V) :-
integer(N),
V is Env^N. %THIS LINE
حيث كل من الخامس و ن غير منضم.أنا تكافح من أجل التفكير في طريقة أنيقة أخرى للقيام بذلك, لا أحد يعرف كيف يمكن أن تجعل برولوغ توليد الأعداد الصحيحة لهذين المتغيرين?
آمل أن يكون هذا مفهوما :)
المحلول
كما هو موضح، يبدو أن مشكلتك غير قابلة للحل، ثم أعتقد أنني سوف أسترحب بالمشكلة بأكملها بشكل مختلف، وتوليد جميع asts حتى Max Num of Tokens.
giveacodicetagpre.غلة
giveacodicetagpre.الحد من طول المدخلات في شاشة DCG هذه مطلوبة بسبب المبلغ غير المكرر غير المحدد // 1
نصائح أخرى
استخدام library(clpfd)
.يحتوي بالضبط على هذا النوع من الوظائف.وليس هناك حاجة لتوليد قيم ملموسة ، طالما أنك لا تحتاج إليها!
?- X #= Y^Z.
Y^Z#=X.
?- X #= Y^Z, [Y,Z]ins 1..3.
Y^Z#=X,
Y in 1..3,
Z in 1..3.
?- X #= Y^Z, [Y,Z]ins 1..3, labeling([], [Y,Z]).
X = Y, Y = Z, Z = 1 ;
X = Y, Y = 1,
Z = 2 ;
X = Y, Y = 1,
Z = 3 ;
X = Y, Y = 2,
Z = 1 ;
X = 4,
Y = Z, Z = 2 ;
X = 8,
Y = 2,
Z = 3 ;
X = Y, Y = 3,
Z = 1 ;
X = 9,
Y = 3,
Z = 2 ;
X = 27,
Y = Z, Z = 3.